import numpy as np
import pandas as pd
import h5py
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.express as px
from pandas.core.dtypes.common import is_numeric_dtype
from scipy.stats import zscore
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import backend, layers, losses, optimizers
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Input, Dropout,BatchNormalization
from tensorflow.keras.utils import to_categorical
from keras_tuner.tuners import RandomSearch
import warnings
warnings.filterwarnings("ignore")
random_state=42
%matplotlib inline
# signals=pd.read_csv('/content/drive/MyDrive/GL/Signal.csv')
signals=pd.read_csv("Signals.csv")
signals_original=signals.copy(deep=True)
signals.head()
| Parameter 1 | Parameter 2 | Parameter 3 | Parameter 4 | Parameter 5 | Parameter 6 | Parameter 7 | Parameter 8 | Parameter 9 | Parameter 10 | Parameter 11 | Signal_Strength | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 7.4 | 0.70 | 0.00 | 1.9 | 0.076 | 11.0 | 34.0 | 0.9978 | 3.51 | 0.56 | 9.4 | 5 |
| 1 | 7.8 | 0.88 | 0.00 | 2.6 | 0.098 | 25.0 | 67.0 | 0.9968 | 3.20 | 0.68 | 9.8 | 5 |
| 2 | 7.8 | 0.76 | 0.04 | 2.3 | 0.092 | 15.0 | 54.0 | 0.9970 | 3.26 | 0.65 | 9.8 | 5 |
| 3 | 11.2 | 0.28 | 0.56 | 1.9 | 0.075 | 17.0 | 60.0 | 0.9980 | 3.16 | 0.58 | 9.8 | 6 |
| 4 | 7.4 | 0.70 | 0.00 | 1.9 | 0.076 | 11.0 | 34.0 | 0.9978 | 3.51 | 0.56 | 9.4 | 5 |
signals.shape
(1599, 12)
Signals dataset contains 1599 entries with 12 features.
# To check the missing data percentage
signals.isnull().mean()*100
Parameter 1 0.0 Parameter 2 0.0 Parameter 3 0.0 Parameter 4 0.0 Parameter 5 0.0 Parameter 6 0.0 Parameter 7 0.0 Parameter 8 0.0 Parameter 9 0.0 Parameter 10 0.0 Parameter 11 0.0 Signal_Strength 0.0 dtype: float64
(signals.isnull().sum()/signals.shape[0])*100
Parameter 1 0.0 Parameter 2 0.0 Parameter 3 0.0 Parameter 4 0.0 Parameter 5 0.0 Parameter 6 0.0 Parameter 7 0.0 Parameter 8 0.0 Parameter 9 0.0 Parameter 10 0.0 Parameter 11 0.0 Signal_Strength 0.0 dtype: float64
signals.isnull().sum()
Parameter 1 0 Parameter 2 0 Parameter 3 0 Parameter 4 0 Parameter 5 0 Parameter 6 0 Parameter 7 0 Parameter 8 0 Parameter 9 0 Parameter 10 0 Parameter 11 0 Signal_Strength 0 dtype: int64
No missing data found, that’s why 0%.
signals[signals.duplicated()]
| Parameter 1 | Parameter 2 | Parameter 3 | Parameter 4 | Parameter 5 | Parameter 6 | Parameter 7 | Parameter 8 | Parameter 9 | Parameter 10 | Parameter 11 | Signal_Strength | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 4 | 7.4 | 0.700 | 0.00 | 1.90 | 0.076 | 11.0 | 34.0 | 0.99780 | 3.51 | 0.56 | 9.4 | 5 |
| 11 | 7.5 | 0.500 | 0.36 | 6.10 | 0.071 | 17.0 | 102.0 | 0.99780 | 3.35 | 0.80 | 10.5 | 5 |
| 27 | 7.9 | 0.430 | 0.21 | 1.60 | 0.106 | 10.0 | 37.0 | 0.99660 | 3.17 | 0.91 | 9.5 | 5 |
| 40 | 7.3 | 0.450 | 0.36 | 5.90 | 0.074 | 12.0 | 87.0 | 0.99780 | 3.33 | 0.83 | 10.5 | 5 |
| 65 | 7.2 | 0.725 | 0.05 | 4.65 | 0.086 | 4.0 | 11.0 | 0.99620 | 3.41 | 0.39 | 10.9 | 5 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1563 | 7.2 | 0.695 | 0.13 | 2.00 | 0.076 | 12.0 | 20.0 | 0.99546 | 3.29 | 0.54 | 10.1 | 5 |
| 1564 | 7.2 | 0.695 | 0.13 | 2.00 | 0.076 | 12.0 | 20.0 | 0.99546 | 3.29 | 0.54 | 10.1 | 5 |
| 1567 | 7.2 | 0.695 | 0.13 | 2.00 | 0.076 | 12.0 | 20.0 | 0.99546 | 3.29 | 0.54 | 10.1 | 5 |
| 1581 | 6.2 | 0.560 | 0.09 | 1.70 | 0.053 | 24.0 | 32.0 | 0.99402 | 3.54 | 0.60 | 11.3 | 5 |
| 1596 | 6.3 | 0.510 | 0.13 | 2.30 | 0.076 | 29.0 | 40.0 | 0.99574 | 3.42 | 0.75 | 11.0 | 6 |
240 rows × 12 columns
signals.drop_duplicates(inplace=True)
signals.reset_index(inplace=True, drop=True)
signals[signals.duplicated()]
| Parameter 1 | Parameter 2 | Parameter 3 | Parameter 4 | Parameter 5 | Parameter 6 | Parameter 7 | Parameter 8 | Parameter 9 | Parameter 10 | Parameter 11 | Signal_Strength |
|---|
Duplicate records have been removed and dataset can be used for further analysis.
signals.Signal_Strength.value_counts()
5 577 6 535 7 167 4 53 8 17 3 10 Name: Signal_Strength, dtype: int64
px.pie(data_frame=signals, values=signals.Signal_Strength.value_counts(), names=signals.Signal_Strength.value_counts().keys(), title='Signal Quality distribution')
px.bar(data_frame=signals.groupby(by=['Signal_Strength']).size().reset_index(name="counts"),x='Signal_Strength',y='counts', barmode="group")
As per the above graphical representation:
signals.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 1359 entries, 0 to 1358 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Parameter 1 1359 non-null float64 1 Parameter 2 1359 non-null float64 2 Parameter 3 1359 non-null float64 3 Parameter 4 1359 non-null float64 4 Parameter 5 1359 non-null float64 5 Parameter 6 1359 non-null float64 6 Parameter 7 1359 non-null float64 7 Parameter 8 1359 non-null float64 8 Parameter 9 1359 non-null float64 9 Parameter 10 1359 non-null float64 10 Parameter 11 1359 non-null float64 11 Signal_Strength 1359 non-null int64 dtypes: float64(11), int64(1) memory usage: 127.5 KB
signals.describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Parameter 1 | 1359.0 | 8.310596 | 1.736990 | 4.60000 | 7.1000 | 7.9000 | 9.20000 | 15.90000 |
| Parameter 2 | 1359.0 | 0.529478 | 0.183031 | 0.12000 | 0.3900 | 0.5200 | 0.64000 | 1.58000 |
| Parameter 3 | 1359.0 | 0.272333 | 0.195537 | 0.00000 | 0.0900 | 0.2600 | 0.43000 | 1.00000 |
| Parameter 4 | 1359.0 | 2.523400 | 1.352314 | 0.90000 | 1.9000 | 2.2000 | 2.60000 | 15.50000 |
| Parameter 5 | 1359.0 | 0.088124 | 0.049377 | 0.01200 | 0.0700 | 0.0790 | 0.09100 | 0.61100 |
| Parameter 6 | 1359.0 | 15.893304 | 10.447270 | 1.00000 | 7.0000 | 14.0000 | 21.00000 | 72.00000 |
| Parameter 7 | 1359.0 | 46.825975 | 33.408946 | 6.00000 | 22.0000 | 38.0000 | 63.00000 | 289.00000 |
| Parameter 8 | 1359.0 | 0.996709 | 0.001869 | 0.99007 | 0.9956 | 0.9967 | 0.99782 | 1.00369 |
| Parameter 9 | 1359.0 | 3.309787 | 0.155036 | 2.74000 | 3.2100 | 3.3100 | 3.40000 | 4.01000 |
| Parameter 10 | 1359.0 | 0.658705 | 0.170667 | 0.33000 | 0.5500 | 0.6200 | 0.73000 | 2.00000 |
| Parameter 11 | 1359.0 | 10.432315 | 1.082065 | 8.40000 | 9.5000 | 10.2000 | 11.10000 | 14.90000 |
| Signal_Strength | 1359.0 | 5.623252 | 0.823578 | 3.00000 | 5.0000 | 6.0000 | 6.00000 | 8.00000 |
numerical_col=[i for i in signals.columns.drop('Signal_Strength') if is_numeric_dtype(signals[i])]
fig=plt.figure(figsize=(20,10))
for i in range(0,len(numerical_col)):
ax=fig.add_subplot(6,2,i+1)
sns.boxplot(data=signals, x=numerical_col[i])
ax.set_title(numerical_col[i],color='orange',weight='bold',fontsize=16)
plt.tight_layout()
plt.show()
Many outliers are present, will be replacing these outliers.
signals_w_outliers=signals.copy(deep=True)
#Treating outliers.
for col_name in signals.columns.drop('Signal_Strength'):
if is_numeric_dtype(signals[col_name]):
q1=np.quantile(signals[col_name], 0.25)
q3=np.quantile(signals[col_name], 0.75)
cut_off=1.5*(q3-q1)
right_whisker= q3 + cut_off
left_whiskers=q1 - cut_off
#Replace every outlier on the upper side by the upper whisker
for i in np.where(signals[col_name] > right_whisker)[0]:
signals.loc[i,col_name] = right_whisker
#Replace every outlier on the lower side by the lower whisker
for i in np.where(signals[col_name] < left_whiskers)[0]:
signals.loc[i,col_name] = left_whiskers
numerical_col=[i for i in signals.columns.drop('Signal_Strength') if is_numeric_dtype(signals[i])]
fig=plt.figure(figsize=(20,10))
for i in range(0,len(numerical_col)):
ax=fig.add_subplot(6,2,i+1)
sns.boxplot(data=signals, x=numerical_col[i])
ax.set_title(numerical_col[i],color='orange',weight='bold',fontsize=16)
plt.tight_layout()
plt.show()
plt.figure(figsize=(15,7))
sns.heatmap(signals.corr(), annot=True,center=True, linewidths=1)
plt.show()
X=signals.drop('Signal_Strength',axis=1)
y=signals['Signal_Strength']
X.shape,y.shape
((1359, 11), (1359,))
Signal dataset is split into feature and target variables for further modelling.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.30, random_state=random_state, stratify=y)
print('Feature training dataset have %d records and %d feature'%(X_train.shape[0], X_train.shape[1]))
print('Feature testing dataset have %d records and %d feature'%(X_test.shape[0], X_test.shape[1]))
print('Target training dataset have %d records'%(y_train.shape[0]))
print('Target testing dataset have %d records'%(y_test.shape[0]))
Feature training dataset have 951 records and 11 feature Feature testing dataset have 408 records and 11 feature Target training dataset have 951 records Target testing dataset have 408 records
Applying zscore which is $$ \frac{X-X_{mean}}{X_{std}} $$
X_train=X_train.apply(zscore)
X_train.head()
| Parameter 1 | Parameter 2 | Parameter 3 | Parameter 4 | Parameter 5 | Parameter 6 | Parameter 7 | Parameter 8 | Parameter 9 | Parameter 10 | Parameter 11 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 732 | -1.109910 | 0.555085 | -0.337200 | -1.178133 | -0.062214 | -0.375435 | -0.465921 | 0.102155 | 1.779210 | 0.075439 | -0.579891 |
| 672 | -0.819939 | 0.582698 | -0.541713 | 0.124947 | 2.198027 | -0.973407 | -0.905697 | -0.323253 | 0.608998 | -0.431829 | -0.117863 |
| 376 | -0.297991 | 0.113270 | 0.378597 | -0.200823 | -0.381306 | 0.521523 | 0.602108 | 0.376786 | -0.366178 | -0.649229 | -1.134324 |
| 71 | -0.877933 | 1.411101 | -1.410895 | 0.124947 | 1.214157 | -0.176111 | -0.528746 | -0.054008 | 1.389139 | -0.721696 | 0.251759 |
| 287 | 1.093872 | -0.936040 | 1.861319 | 0.939372 | 2.171436 | -0.574759 | -0.183207 | 0.699880 | -0.496202 | 0.075439 | 1.915058 |
X_test=X_test.apply(zscore)
X_test.head()
| Parameter 1 | Parameter 2 | Parameter 3 | Parameter 4 | Parameter 5 | Parameter 6 | Parameter 7 | Parameter 8 | Parameter 9 | Parameter 10 | Parameter 11 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1185 | -0.614449 | 0.393462 | -0.019291 | -0.550950 | -0.095020 | 0.149752 | 2.099022 | -0.534685 | -0.248584 | -0.963137 | -0.510120 |
| 699 | -0.412926 | -0.262259 | 0.237928 | 0.801156 | -0.660156 | -1.232816 | -1.033787 | 0.126674 | -0.676376 | -0.742290 | -0.126207 |
| 1001 | 0.997739 | -0.619925 | 1.009586 | -0.381937 | -0.434102 | -1.126464 | -0.998587 | -0.140296 | -0.319883 | 0.656405 | 1.793361 |
| 281 | 1.400786 | 0.393462 | 0.803810 | 0.801156 | 0.470115 | 2.064077 | 1.007819 | 1.382650 | -0.248584 | 0.361943 | -0.894034 |
| 1306 | -1.353369 | 0.691517 | -0.893837 | 0.294116 | -0.038507 | -0.062951 | -0.646586 | -0.813790 | 1.819077 | -0.153366 | 1.505426 |
Target label ranges from 3 to 8, so total number of classes will be as 'max(y)+1` which is 9.
y_cat_train=tf.keras.utils.to_categorical(y_train,num_classes=9)
y_cat_test=tf.keras.utils.to_categorical(y_test,num_classes=9)
print('Target training dataset have %d records and %d feature'%(y_cat_train.shape[0],y_cat_train.shape[1]))
print('Target testing dataset have %d records and %d feature'%(y_cat_test.shape[0],y_cat_test.shape[1]))
Target training dataset have 951 records and 9 feature Target testing dataset have 408 records and 9 feature
backend.clear_session()
tf.random.set_seed(random_state)
#Initialize sequenial model
model = Sequential()
model.add(Dense(input_dim=11, units=64,activation='relu'))
model.add(Dense(16,activation='relu'))
model.add(Dense(8,activation='relu'))
# Add dense layer which provides 8 outputs after applying softmax
model.add(Dense(9, activation='softmax'))
#compile the model
optimizer = tf.keras.optimizers.SGD(0.01)
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 64) 768
dense_1 (Dense) (None, 16) 1040
dense_2 (Dense) (None, 8) 136
dense_3 (Dense) (None, 9) 81
=================================================================
Total params: 2,025
Trainable params: 2,025
Non-trainable params: 0
_________________________________________________________________
# Fit the model
history=model.fit(x=X_train, y=y_cat_train, batch_size=20, epochs=100, validation_split=0.2, verbose=1)
Epoch 1/100 38/38 [==============================] - 1s 9ms/step - loss: 1.9977 - accuracy: 0.3908 - val_loss: 1.9110 - val_accuracy: 0.3927 Epoch 2/100 38/38 [==============================] - 0s 3ms/step - loss: 1.7836 - accuracy: 0.4329 - val_loss: 1.7170 - val_accuracy: 0.3874 Epoch 3/100 38/38 [==============================] - 0s 3ms/step - loss: 1.6111 - accuracy: 0.4342 - val_loss: 1.5688 - val_accuracy: 0.3874 Epoch 4/100 38/38 [==============================] - 0s 3ms/step - loss: 1.4822 - accuracy: 0.4342 - val_loss: 1.4543 - val_accuracy: 0.3874 Epoch 5/100 38/38 [==============================] - 0s 3ms/step - loss: 1.3856 - accuracy: 0.4421 - val_loss: 1.3670 - val_accuracy: 0.4241 Epoch 6/100 38/38 [==============================] - 0s 3ms/step - loss: 1.3145 - accuracy: 0.4750 - val_loss: 1.3019 - val_accuracy: 0.4764 Epoch 7/100 38/38 [==============================] - 0s 3ms/step - loss: 1.2634 - accuracy: 0.5105 - val_loss: 1.2546 - val_accuracy: 0.5131 Epoch 8/100 38/38 [==============================] - 0s 3ms/step - loss: 1.2244 - accuracy: 0.5237 - val_loss: 1.2167 - val_accuracy: 0.5393 Epoch 9/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1923 - accuracy: 0.5355 - val_loss: 1.1864 - val_accuracy: 0.5497 Epoch 10/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1661 - accuracy: 0.5408 - val_loss: 1.1598 - val_accuracy: 0.5550 Epoch 11/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1425 - accuracy: 0.5632 - val_loss: 1.1379 - val_accuracy: 0.5654 Epoch 12/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1218 - accuracy: 0.5711 - val_loss: 1.1171 - val_accuracy: 0.5759 Epoch 13/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1033 - accuracy: 0.5724 - val_loss: 1.0999 - val_accuracy: 0.5707 Epoch 14/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0869 - accuracy: 0.5816 - val_loss: 1.0839 - val_accuracy: 0.5864 Epoch 15/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0741 - accuracy: 0.5776 - val_loss: 1.0691 - val_accuracy: 0.5864 Epoch 16/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0630 - accuracy: 0.5829 - val_loss: 1.0544 - val_accuracy: 0.6126 Epoch 17/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0539 - accuracy: 0.5763 - val_loss: 1.0435 - val_accuracy: 0.6073 Epoch 18/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0442 - accuracy: 0.5803 - val_loss: 1.0365 - val_accuracy: 0.6178 Epoch 19/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0372 - accuracy: 0.5868 - val_loss: 1.0255 - val_accuracy: 0.6126 Epoch 20/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0297 - accuracy: 0.5803 - val_loss: 1.0185 - val_accuracy: 0.6126 Epoch 21/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0234 - accuracy: 0.5842 - val_loss: 1.0125 - val_accuracy: 0.6126 Epoch 22/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0181 - accuracy: 0.5868 - val_loss: 1.0045 - val_accuracy: 0.6073 Epoch 23/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0126 - accuracy: 0.5789 - val_loss: 1.0004 - val_accuracy: 0.6021 Epoch 24/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0070 - accuracy: 0.5816 - val_loss: 0.9904 - val_accuracy: 0.6021 Epoch 25/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0030 - accuracy: 0.5829 - val_loss: 0.9846 - val_accuracy: 0.6178 Epoch 26/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9992 - accuracy: 0.5895 - val_loss: 0.9809 - val_accuracy: 0.6021 Epoch 27/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9946 - accuracy: 0.5803 - val_loss: 0.9759 - val_accuracy: 0.6126 Epoch 28/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9906 - accuracy: 0.5921 - val_loss: 0.9763 - val_accuracy: 0.6126 Epoch 29/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9875 - accuracy: 0.5921 - val_loss: 0.9719 - val_accuracy: 0.6073 Epoch 30/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9843 - accuracy: 0.5921 - val_loss: 0.9656 - val_accuracy: 0.6021 Epoch 31/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9807 - accuracy: 0.5908 - val_loss: 0.9642 - val_accuracy: 0.6021 Epoch 32/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9783 - accuracy: 0.5921 - val_loss: 0.9606 - val_accuracy: 0.6126 Epoch 33/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9749 - accuracy: 0.6000 - val_loss: 0.9584 - val_accuracy: 0.6073 Epoch 34/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9718 - accuracy: 0.5908 - val_loss: 0.9537 - val_accuracy: 0.6178 Epoch 35/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9690 - accuracy: 0.5895 - val_loss: 0.9502 - val_accuracy: 0.6178 Epoch 36/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9675 - accuracy: 0.6079 - val_loss: 0.9484 - val_accuracy: 0.6178 Epoch 37/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9646 - accuracy: 0.6013 - val_loss: 0.9463 - val_accuracy: 0.6178 Epoch 38/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9613 - accuracy: 0.6039 - val_loss: 0.9492 - val_accuracy: 0.6126 Epoch 39/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9589 - accuracy: 0.6013 - val_loss: 0.9422 - val_accuracy: 0.6126 Epoch 40/100 38/38 [==============================] - 0s 2ms/step - loss: 0.9568 - accuracy: 0.6039 - val_loss: 0.9418 - val_accuracy: 0.5969 Epoch 41/100 38/38 [==============================] - 0s 2ms/step - loss: 0.9543 - accuracy: 0.6000 - val_loss: 0.9369 - val_accuracy: 0.6178 Epoch 42/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9515 - accuracy: 0.6079 - val_loss: 0.9369 - val_accuracy: 0.6126 Epoch 43/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9505 - accuracy: 0.6039 - val_loss: 0.9328 - val_accuracy: 0.6178 Epoch 44/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9483 - accuracy: 0.6000 - val_loss: 0.9337 - val_accuracy: 0.6073 Epoch 45/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9435 - accuracy: 0.6145 - val_loss: 0.9326 - val_accuracy: 0.6230 Epoch 46/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9438 - accuracy: 0.6066 - val_loss: 0.9269 - val_accuracy: 0.6178 Epoch 47/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9407 - accuracy: 0.6092 - val_loss: 0.9240 - val_accuracy: 0.6073 Epoch 48/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9389 - accuracy: 0.6171 - val_loss: 0.9289 - val_accuracy: 0.6230 Epoch 49/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9369 - accuracy: 0.6145 - val_loss: 0.9225 - val_accuracy: 0.6073 Epoch 50/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9357 - accuracy: 0.6145 - val_loss: 0.9205 - val_accuracy: 0.6021 Epoch 51/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9333 - accuracy: 0.6211 - val_loss: 0.9186 - val_accuracy: 0.6126 Epoch 52/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9322 - accuracy: 0.6171 - val_loss: 0.9190 - val_accuracy: 0.6178 Epoch 53/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9298 - accuracy: 0.6132 - val_loss: 0.9182 - val_accuracy: 0.6073 Epoch 54/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9286 - accuracy: 0.6237 - val_loss: 0.9176 - val_accuracy: 0.6021 Epoch 55/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9266 - accuracy: 0.6171 - val_loss: 0.9143 - val_accuracy: 0.6021 Epoch 56/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9247 - accuracy: 0.6237 - val_loss: 0.9153 - val_accuracy: 0.6178 Epoch 57/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9228 - accuracy: 0.6263 - val_loss: 0.9130 - val_accuracy: 0.6073 Epoch 58/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9208 - accuracy: 0.6289 - val_loss: 0.9164 - val_accuracy: 0.6126 Epoch 59/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9196 - accuracy: 0.6276 - val_loss: 0.9107 - val_accuracy: 0.6126 Epoch 60/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9176 - accuracy: 0.6303 - val_loss: 0.9109 - val_accuracy: 0.6126 Epoch 61/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9158 - accuracy: 0.6289 - val_loss: 0.9083 - val_accuracy: 0.6126 Epoch 62/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9143 - accuracy: 0.6382 - val_loss: 0.9059 - val_accuracy: 0.6126 Epoch 63/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9115 - accuracy: 0.6329 - val_loss: 0.9142 - val_accuracy: 0.6178 Epoch 64/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9116 - accuracy: 0.6237 - val_loss: 0.9060 - val_accuracy: 0.6178 Epoch 65/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9093 - accuracy: 0.6382 - val_loss: 0.9061 - val_accuracy: 0.6178 Epoch 66/100 38/38 [==============================] - 0s 2ms/step - loss: 0.9074 - accuracy: 0.6342 - val_loss: 0.9074 - val_accuracy: 0.6126 Epoch 67/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9066 - accuracy: 0.6276 - val_loss: 0.9039 - val_accuracy: 0.6126 Epoch 68/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9047 - accuracy: 0.6303 - val_loss: 0.9057 - val_accuracy: 0.6178 Epoch 69/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9036 - accuracy: 0.6368 - val_loss: 0.9019 - val_accuracy: 0.6230 Epoch 70/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9007 - accuracy: 0.6447 - val_loss: 0.9045 - val_accuracy: 0.6178 Epoch 71/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8982 - accuracy: 0.6408 - val_loss: 0.9066 - val_accuracy: 0.6126 Epoch 72/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8984 - accuracy: 0.6421 - val_loss: 0.9038 - val_accuracy: 0.6126 Epoch 73/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8966 - accuracy: 0.6355 - val_loss: 0.9009 - val_accuracy: 0.6178 Epoch 74/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8943 - accuracy: 0.6434 - val_loss: 0.9017 - val_accuracy: 0.6230 Epoch 75/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8925 - accuracy: 0.6355 - val_loss: 0.9001 - val_accuracy: 0.6126 Epoch 76/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8910 - accuracy: 0.6421 - val_loss: 0.9033 - val_accuracy: 0.6126 Epoch 77/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8891 - accuracy: 0.6355 - val_loss: 0.8994 - val_accuracy: 0.6178 Epoch 78/100 38/38 [==============================] - 0s 2ms/step - loss: 0.8890 - accuracy: 0.6382 - val_loss: 0.8963 - val_accuracy: 0.6283 Epoch 79/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8861 - accuracy: 0.6382 - val_loss: 0.8950 - val_accuracy: 0.6335 Epoch 80/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8855 - accuracy: 0.6474 - val_loss: 0.8991 - val_accuracy: 0.6178 Epoch 81/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8842 - accuracy: 0.6447 - val_loss: 0.8976 - val_accuracy: 0.6178 Epoch 82/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8811 - accuracy: 0.6461 - val_loss: 0.8940 - val_accuracy: 0.6230 Epoch 83/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8808 - accuracy: 0.6513 - val_loss: 0.8978 - val_accuracy: 0.6126 Epoch 84/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8797 - accuracy: 0.6500 - val_loss: 0.8976 - val_accuracy: 0.6178 Epoch 85/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8775 - accuracy: 0.6553 - val_loss: 0.8922 - val_accuracy: 0.6387 Epoch 86/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8765 - accuracy: 0.6645 - val_loss: 0.8952 - val_accuracy: 0.6230 Epoch 87/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8732 - accuracy: 0.6539 - val_loss: 0.9036 - val_accuracy: 0.6178 Epoch 88/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8752 - accuracy: 0.6539 - val_loss: 0.8969 - val_accuracy: 0.6126 Epoch 89/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8713 - accuracy: 0.6605 - val_loss: 0.8936 - val_accuracy: 0.6230 Epoch 90/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8704 - accuracy: 0.6605 - val_loss: 0.8918 - val_accuracy: 0.6335 Epoch 91/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8687 - accuracy: 0.6632 - val_loss: 0.8900 - val_accuracy: 0.6492 Epoch 92/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8681 - accuracy: 0.6513 - val_loss: 0.8923 - val_accuracy: 0.6230 Epoch 93/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8669 - accuracy: 0.6592 - val_loss: 0.8956 - val_accuracy: 0.6073 Epoch 94/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8623 - accuracy: 0.6711 - val_loss: 0.8934 - val_accuracy: 0.6492 Epoch 95/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8643 - accuracy: 0.6618 - val_loss: 0.8918 - val_accuracy: 0.6335 Epoch 96/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8607 - accuracy: 0.6592 - val_loss: 0.8904 - val_accuracy: 0.6440 Epoch 97/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8615 - accuracy: 0.6618 - val_loss: 0.8920 - val_accuracy: 0.6283 Epoch 98/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8580 - accuracy: 0.6605 - val_loss: 0.8909 - val_accuracy: 0.6335 Epoch 99/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8591 - accuracy: 0.6566 - val_loss: 0.8902 - val_accuracy: 0.6492 Epoch 100/100 38/38 [==============================] - 0s 3ms/step - loss: 0.8562 - accuracy: 0.6632 - val_loss: 0.8899 - val_accuracy: 0.6440
# Capturing learning history per epoch
hist = pd.DataFrame(history.history)
hist['epoch'] = history.epoch
# Plotting Loss at different epochs
plt.title('Training Loss vs Validation Loss',fontsize=15,color="green")
plt.plot(hist['loss'])
plt.plot(hist['val_loss'])
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(("training" , "validation") , loc ='best')
plt.show()
# Plotting Accuracy at different epochs
plt.title('Training Accuracy vs Validation Accuracy',fontsize=15,color="green")
plt.plot(hist['accuracy'])
plt.plot(hist['val_accuracy'])
plt.ylabel('accuracy')
plt.xlabel('Epoch')
plt.legend(("training" , "validation") , loc ='best')
plt.show()
# calculate score of training data
model.evaluate(X_train, y_cat_train, batch_size=20, verbose=1)
48/48 [==============================] - 0s 1ms/step - loss: 0.8581 - accuracy: 0.6519
[0.8580824136734009, 0.6519452929496765]
# calculate score of testing data
model.evaluate(X_test, y_cat_test, batch_size=20, verbose=1)
21/21 [==============================] - 0s 2ms/step - loss: 0.9738 - accuracy: 0.5809
[0.9737644791603088, 0.5808823704719543]
# Predicting for X_test
y_pred=model.predict(X_test)
y_pred
13/13 [==============================] - 0s 1ms/step
array([[1.9374361e-06, 6.9513757e-05, 3.0812291e-05, ..., 1.4998730e-01,
2.0264250e-03, 8.8195171e-05],
[3.5061644e-04, 2.0829607e-03, 8.8139251e-04, ..., 4.1179952e-01,
3.9620627e-02, 4.5146686e-03],
[2.1333779e-04, 2.7704018e-04, 1.3851421e-04, ..., 3.1349000e-01,
6.2052524e-01, 4.3284602e-02],
...,
[4.3199203e-04, 1.1876954e-03, 1.8928554e-04, ..., 3.9976192e-01,
3.1093350e-01, 2.2049813e-02],
[2.0673810e-06, 7.9938269e-05, 4.5056448e-05, ..., 3.7442851e-01,
1.2831197e-02, 3.9829564e-04],
[3.5760399e-06, 9.7782715e-05, 4.6790516e-05, ..., 1.9788137e-01,
2.6948268e-03, 1.3410010e-04]], dtype=float32)
y_pred_final=[]
for i in y_pred:
y_pred_final.append(np.argmax(i))
print(y_pred_final)
[5, 5, 7, 5, 6, 5, 5, 6, 5, 6, 5, 6, 5, 5, 5, 6, 5, 5, 6, 6, 5, 7, 5, 6, 6, 5, 5, 7, 5, 6, 6, 5, 5, 5, 5, 6, 7, 5, 5, 7, 5, 6, 5, 7, 6, 5, 6, 6, 6, 6, 5, 6, 6, 6, 6, 5, 6, 5, 5, 5, 7, 6, 6, 5, 7, 5, 6, 5, 6, 6, 6, 5, 5, 6, 6, 5, 6, 5, 6, 6, 5, 6, 6, 5, 5, 7, 6, 5, 6, 6, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 6, 5, 5, 5, 5, 6, 5, 6, 5, 7, 5, 5, 6, 6, 5, 6, 7, 6, 5, 7, 6, 6, 7, 6, 5, 5, 5, 6, 5, 6, 6, 5, 5, 6, 5, 6, 5, 5, 7, 6, 5, 5, 5, 6, 5, 5, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 6, 6, 5, 6, 5, 6, 5, 5, 7, 5, 5, 5, 6, 6, 6, 5, 5, 6, 6, 5, 5, 6, 5, 6, 6, 5, 7, 6, 5, 6, 5, 5, 6, 5, 6, 7, 7, 6, 6, 6, 6, 5, 6, 5, 5, 6, 6, 6, 6, 7, 5, 7, 6, 5, 5, 6, 6, 5, 5, 5, 5, 6, 6, 5, 5, 7, 6, 5, 7, 5, 5, 5, 7, 5, 5, 6, 6, 6, 6, 5, 5, 6, 5, 5, 5, 6, 5, 5, 7, 5, 6, 6, 6, 6, 5, 6, 5, 5, 7, 6, 5, 6, 5, 6, 6, 6, 5, 5, 6, 5, 5, 7, 6, 5, 5, 5, 7, 6, 5, 5, 7, 5, 5, 6, 6, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 5, 6, 7, 5, 7, 5, 5, 5, 7, 5, 7, 7, 7, 6, 5, 5, 7, 6, 6, 5, 5, 5, 6, 6, 5, 6, 6, 6, 6, 5, 6, 6, 5, 5, 6, 6, 5, 6, 6, 7, 6, 7, 6, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 7, 5, 6, 6, 5, 5, 5, 6, 6, 7, 5, 6, 6, 6, 5, 5, 5, 5, 6, 6, 5, 5, 7, 5, 7, 5, 6, 5, 6, 6, 6, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 6, 5, 5]
print('Classification Report')
print(classification_report(y_test,y_pred_final))
Classification Report
precision recall f1-score support
3 0.00 0.00 0.00 3
4 0.00 0.00 0.00 16
5 0.64 0.72 0.68 173
6 0.54 0.58 0.56 161
7 0.47 0.40 0.43 50
8 0.00 0.00 0.00 5
accuracy 0.58 408
macro avg 0.27 0.28 0.28 408
weighted avg 0.54 0.58 0.56 408
cm=confusion_matrix(y_test.tolist(),y_pred_final)
plt.figure(figsize=(10,7))
sns.heatmap(cm,annot=True,fmt='d', cmap='Blues', xticklabels=[3,4,5,6,7,8], yticklabels=[3,4,5,6,7,8])
plt.xlabel('Predicted')
plt.ylabel('Truth')
plt.show()
Tuning params using Keras Tuner.
backend.clear_session()
tf.random.set_seed(random_state)
def build_model(h):
model_keras = keras.Sequential()
for i in range(h.Int('num_layers', 2, 5)):
model_keras.add(layers.Dense(units=h.Int('units_' + str(i),
min_value=32,
max_value=256,
step=10),
activation=h.Choice('act_' + str(i), ['relu', 'sigmoid'])))
model_keras.add(layers.Dense(9, activation='softmax'))
model_keras.compile(
optimizer=keras.optimizers.SGD(
h.Choice('learning_rate', [1e-2, 1e-3, 1e-4, 1e-5])),
loss='categorical_crossentropy',
metrics=['accuracy'])
return model_keras
tuner = RandomSearch(
build_model,
objective='val_accuracy',
max_trials=5,
executions_per_trial=3,
project_name='Job_')
INFO:tensorflow:Reloading Tuner from .\Job_\tuner0.json
tuner.search_space_summary()
Search space summary
Default search space size: 12
num_layers (Int)
{'default': None, 'conditions': [], 'min_value': 2, 'max_value': 5, 'step': 1, 'sampling': 'linear'}
units_0 (Int)
{'default': None, 'conditions': [], 'min_value': 32, 'max_value': 256, 'step': 10, 'sampling': 'linear'}
act_0 (Choice)
{'default': 'relu', 'conditions': [], 'values': ['relu', 'sigmoid'], 'ordered': False}
units_1 (Int)
{'default': None, 'conditions': [], 'min_value': 32, 'max_value': 256, 'step': 10, 'sampling': 'linear'}
act_1 (Choice)
{'default': 'relu', 'conditions': [], 'values': ['relu', 'sigmoid'], 'ordered': False}
learning_rate (Choice)
{'default': 0.01, 'conditions': [], 'values': [0.01, 0.001, 0.0001, 1e-05], 'ordered': True}
units_2 (Int)
{'default': None, 'conditions': [], 'min_value': 32, 'max_value': 256, 'step': 10, 'sampling': 'linear'}
act_2 (Choice)
{'default': 'relu', 'conditions': [], 'values': ['relu', 'sigmoid'], 'ordered': False}
units_3 (Int)
{'default': None, 'conditions': [], 'min_value': 32, 'max_value': 256, 'step': 10, 'sampling': 'linear'}
act_3 (Choice)
{'default': 'relu', 'conditions': [], 'values': ['relu', 'sigmoid'], 'ordered': False}
units_4 (Int)
{'default': None, 'conditions': [], 'min_value': 32, 'max_value': 256, 'step': 10, 'sampling': 'linear'}
act_4 (Choice)
{'default': 'relu', 'conditions': [], 'values': ['relu', 'sigmoid'], 'ordered': False}
### Searching the best model on X and y train
tuner.search(X_train, y_cat_train,
epochs=100,
validation_split = 0.2, verbose=1)
INFO:tensorflow:Oracle triggered exit
## Printing the best models with their hyperparameters
tuner.results_summary()
Results summary Results in .\Job_ Showing 10 best trials <keras_tuner.engine.objective.Objective object at 0x0000019F40D5EDC0> Trial summary Hyperparameters: num_layers: 4 units_0: 202 act_0: relu units_1: 212 act_1: relu learning_rate: 0.01 units_2: 112 act_2: sigmoid units_3: 182 act_3: sigmoid units_4: 212 act_4: sigmoid Score: 0.6108202338218689 Trial summary Hyperparameters: num_layers: 5 units_0: 202 act_0: sigmoid units_1: 162 act_1: relu learning_rate: 0.0001 units_2: 32 act_2: relu units_3: 32 act_3: relu units_4: 32 act_4: relu Score: 0.4624781807263692 Trial summary Hyperparameters: num_layers: 5 units_0: 62 act_0: sigmoid units_1: 82 act_1: sigmoid learning_rate: 0.0001 units_2: 112 act_2: sigmoid units_3: 52 act_3: sigmoid units_4: 152 act_4: sigmoid Score: 0.4589877724647522 Trial summary Hyperparameters: num_layers: 5 units_0: 172 act_0: relu units_1: 92 act_1: sigmoid learning_rate: 0.001 units_2: 182 act_2: relu units_3: 122 act_3: sigmoid units_4: 122 act_4: relu Score: 0.4031413495540619 Trial summary Hyperparameters: num_layers: 3 units_0: 212 act_0: sigmoid units_1: 152 act_1: sigmoid learning_rate: 1e-05 units_2: 72 act_2: relu units_3: 82 act_3: relu units_4: 52 act_4: relu Score: 0.07678882777690887
backend.clear_session()
tf.random.set_seed(random_state)
model_keras = Sequential()
model_keras.add(Dense(202,activation='relu',kernel_initializer='he_uniform',input_dim = X_train.shape[1]))
model_keras.add(Dense(212,activation='relu',kernel_initializer='he_uniform'))
model_keras.add(Dense(112,activation='sigmoid',kernel_initializer='he_uniform'))
model_keras.add(Dense(182,activation='sigmoid',kernel_initializer='he_uniform'))
model_keras.add(Dense(212,activation='sigmoid',kernel_initializer='he_uniform'))
model_keras.add(layers.Dense(9, activation='softmax'))
optimizer = tf.keras.optimizers.SGD(0.01)
model_keras.compile(loss='categorical_crossentropy',optimizer=optimizer,metrics=['accuracy'])
model_keras.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 202) 2424
dense_1 (Dense) (None, 212) 43036
dense_2 (Dense) (None, 112) 23856
dense_3 (Dense) (None, 182) 20566
dense_4 (Dense) (None, 212) 38796
dense_5 (Dense) (None, 9) 1917
=================================================================
Total params: 130,595
Trainable params: 130,595
Non-trainable params: 0
_________________________________________________________________
history_keras = model_keras.fit(x=X_train, y=y_cat_train, batch_size=20, epochs=100, validation_split=0.2, verbose=1)
Epoch 1/100 38/38 [==============================] - 1s 9ms/step - loss: 1.4809 - accuracy: 0.3895 - val_loss: 1.2525 - val_accuracy: 0.3874 Epoch 2/100 38/38 [==============================] - 0s 4ms/step - loss: 1.2533 - accuracy: 0.4276 - val_loss: 1.2252 - val_accuracy: 0.3874 Epoch 3/100 38/38 [==============================] - 0s 4ms/step - loss: 1.2377 - accuracy: 0.4171 - val_loss: 1.2120 - val_accuracy: 0.3874 Epoch 4/100 38/38 [==============================] - 0s 4ms/step - loss: 1.2305 - accuracy: 0.4184 - val_loss: 1.1957 - val_accuracy: 0.4346 Epoch 5/100 38/38 [==============================] - 0s 4ms/step - loss: 1.2276 - accuracy: 0.4237 - val_loss: 1.1887 - val_accuracy: 0.4293 Epoch 6/100 38/38 [==============================] - 0s 3ms/step - loss: 1.2208 - accuracy: 0.4237 - val_loss: 1.1842 - val_accuracy: 0.5079 Epoch 7/100 38/38 [==============================] - 0s 3ms/step - loss: 1.2214 - accuracy: 0.4289 - val_loss: 1.1911 - val_accuracy: 0.3874 Epoch 8/100 38/38 [==============================] - 0s 4ms/step - loss: 1.2165 - accuracy: 0.4382 - val_loss: 1.1757 - val_accuracy: 0.4450 Epoch 9/100 38/38 [==============================] - 0s 4ms/step - loss: 1.2106 - accuracy: 0.4395 - val_loss: 1.1738 - val_accuracy: 0.4607 Epoch 10/100 38/38 [==============================] - 0s 4ms/step - loss: 1.2114 - accuracy: 0.4513 - val_loss: 1.1705 - val_accuracy: 0.4398 Epoch 11/100 38/38 [==============================] - 0s 4ms/step - loss: 1.2106 - accuracy: 0.4355 - val_loss: 1.1831 - val_accuracy: 0.3874 Epoch 12/100 38/38 [==============================] - 0s 3ms/step - loss: 1.2073 - accuracy: 0.4500 - val_loss: 1.1701 - val_accuracy: 0.5393 Epoch 13/100 38/38 [==============================] - 0s 4ms/step - loss: 1.2056 - accuracy: 0.4474 - val_loss: 1.1703 - val_accuracy: 0.3979 Epoch 14/100 38/38 [==============================] - 0s 4ms/step - loss: 1.2003 - accuracy: 0.4724 - val_loss: 1.1836 - val_accuracy: 0.3874 Epoch 15/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1966 - accuracy: 0.4684 - val_loss: 1.1766 - val_accuracy: 0.3874 Epoch 16/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1966 - accuracy: 0.4829 - val_loss: 1.1553 - val_accuracy: 0.5026 Epoch 17/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1980 - accuracy: 0.4776 - val_loss: 1.1538 - val_accuracy: 0.5864 Epoch 18/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1917 - accuracy: 0.4855 - val_loss: 1.1643 - val_accuracy: 0.3874 Epoch 19/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1906 - accuracy: 0.5066 - val_loss: 1.1588 - val_accuracy: 0.4136 Epoch 20/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1863 - accuracy: 0.4868 - val_loss: 1.1478 - val_accuracy: 0.5707 Epoch 21/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1831 - accuracy: 0.5000 - val_loss: 1.1505 - val_accuracy: 0.4398 Epoch 22/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1806 - accuracy: 0.5145 - val_loss: 1.1402 - val_accuracy: 0.5759 Epoch 23/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1770 - accuracy: 0.4987 - val_loss: 1.1509 - val_accuracy: 0.4084 Epoch 24/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1729 - accuracy: 0.5382 - val_loss: 1.1385 - val_accuracy: 0.5340 Epoch 25/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1693 - accuracy: 0.5263 - val_loss: 1.1299 - val_accuracy: 0.5707 Epoch 26/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1651 - accuracy: 0.5250 - val_loss: 1.1249 - val_accuracy: 0.5707 Epoch 27/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1619 - accuracy: 0.5355 - val_loss: 1.1318 - val_accuracy: 0.5131 Epoch 28/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1575 - accuracy: 0.5237 - val_loss: 1.1335 - val_accuracy: 0.4398 Epoch 29/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1542 - accuracy: 0.5408 - val_loss: 1.1188 - val_accuracy: 0.5393 Epoch 30/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1509 - accuracy: 0.5329 - val_loss: 1.1073 - val_accuracy: 0.5812 Epoch 31/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1445 - accuracy: 0.5632 - val_loss: 1.1059 - val_accuracy: 0.5654 Epoch 32/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1384 - accuracy: 0.5539 - val_loss: 1.1029 - val_accuracy: 0.5759 Epoch 33/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1345 - accuracy: 0.5632 - val_loss: 1.0972 - val_accuracy: 0.5707 Epoch 34/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1275 - accuracy: 0.5605 - val_loss: 1.0919 - val_accuracy: 0.5602 Epoch 35/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1220 - accuracy: 0.5592 - val_loss: 1.0775 - val_accuracy: 0.5969 Epoch 36/100 38/38 [==============================] - 0s 5ms/step - loss: 1.1200 - accuracy: 0.5618 - val_loss: 1.0720 - val_accuracy: 0.5969 Epoch 37/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1170 - accuracy: 0.5579 - val_loss: 1.0669 - val_accuracy: 0.5916 Epoch 38/100 38/38 [==============================] - 0s 3ms/step - loss: 1.1075 - accuracy: 0.5724 - val_loss: 1.0812 - val_accuracy: 0.5550 Epoch 39/100 38/38 [==============================] - 0s 4ms/step - loss: 1.1006 - accuracy: 0.5711 - val_loss: 1.0536 - val_accuracy: 0.5969 Epoch 40/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0970 - accuracy: 0.5711 - val_loss: 1.0590 - val_accuracy: 0.5707 Epoch 41/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0910 - accuracy: 0.5711 - val_loss: 1.0426 - val_accuracy: 0.5969 Epoch 42/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0827 - accuracy: 0.5895 - val_loss: 1.0543 - val_accuracy: 0.5654 Epoch 43/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0833 - accuracy: 0.5632 - val_loss: 1.0318 - val_accuracy: 0.5812 Epoch 44/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0776 - accuracy: 0.5711 - val_loss: 1.0357 - val_accuracy: 0.5759 Epoch 45/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0671 - accuracy: 0.5855 - val_loss: 1.0281 - val_accuracy: 0.5759 Epoch 46/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0644 - accuracy: 0.5750 - val_loss: 1.0143 - val_accuracy: 0.6021 Epoch 47/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0560 - accuracy: 0.5789 - val_loss: 1.0114 - val_accuracy: 0.5969 Epoch 48/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0557 - accuracy: 0.5842 - val_loss: 1.0217 - val_accuracy: 0.5707 Epoch 49/100 38/38 [==============================] - 0s 4ms/step - loss: 1.0489 - accuracy: 0.5697 - val_loss: 1.0010 - val_accuracy: 0.6021 Epoch 50/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0441 - accuracy: 0.5816 - val_loss: 0.9965 - val_accuracy: 0.6073 Epoch 51/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0409 - accuracy: 0.5816 - val_loss: 0.9914 - val_accuracy: 0.5969 Epoch 52/100 38/38 [==============================] - 0s 4ms/step - loss: 1.0393 - accuracy: 0.5855 - val_loss: 0.9913 - val_accuracy: 0.5969 Epoch 53/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0336 - accuracy: 0.5789 - val_loss: 0.9865 - val_accuracy: 0.6021 Epoch 54/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0322 - accuracy: 0.5868 - val_loss: 0.9815 - val_accuracy: 0.5969 Epoch 55/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0275 - accuracy: 0.5816 - val_loss: 0.9785 - val_accuracy: 0.5969 Epoch 56/100 38/38 [==============================] - 0s 4ms/step - loss: 1.0247 - accuracy: 0.5882 - val_loss: 0.9828 - val_accuracy: 0.5812 Epoch 57/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0209 - accuracy: 0.5855 - val_loss: 0.9734 - val_accuracy: 0.6021 Epoch 58/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0183 - accuracy: 0.5934 - val_loss: 0.9766 - val_accuracy: 0.5864 Epoch 59/100 38/38 [==============================] - 0s 4ms/step - loss: 1.0151 - accuracy: 0.5737 - val_loss: 0.9682 - val_accuracy: 0.6021 Epoch 60/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0105 - accuracy: 0.5855 - val_loss: 0.9647 - val_accuracy: 0.5969 Epoch 61/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0099 - accuracy: 0.5921 - val_loss: 0.9611 - val_accuracy: 0.5916 Epoch 62/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0052 - accuracy: 0.5921 - val_loss: 0.9615 - val_accuracy: 0.6073 Epoch 63/100 38/38 [==============================] - 0s 4ms/step - loss: 1.0042 - accuracy: 0.5895 - val_loss: 0.9714 - val_accuracy: 0.5916 Epoch 64/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0021 - accuracy: 0.5789 - val_loss: 0.9556 - val_accuracy: 0.5916 Epoch 65/100 38/38 [==============================] - 0s 3ms/step - loss: 1.0005 - accuracy: 0.5921 - val_loss: 0.9552 - val_accuracy: 0.6021 Epoch 66/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9999 - accuracy: 0.5868 - val_loss: 0.9520 - val_accuracy: 0.6021 Epoch 67/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9978 - accuracy: 0.5789 - val_loss: 0.9489 - val_accuracy: 0.5969 Epoch 68/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9970 - accuracy: 0.5882 - val_loss: 0.9610 - val_accuracy: 0.5916 Epoch 69/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9958 - accuracy: 0.5882 - val_loss: 0.9467 - val_accuracy: 0.5916 Epoch 70/100 38/38 [==============================] - 0s 4ms/step - loss: 0.9927 - accuracy: 0.5974 - val_loss: 0.9501 - val_accuracy: 0.6073 Epoch 71/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9869 - accuracy: 0.5921 - val_loss: 0.9612 - val_accuracy: 0.6178 Epoch 72/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9904 - accuracy: 0.5908 - val_loss: 0.9471 - val_accuracy: 0.5969 Epoch 73/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9883 - accuracy: 0.5868 - val_loss: 0.9432 - val_accuracy: 0.5969 Epoch 74/100 38/38 [==============================] - 0s 4ms/step - loss: 0.9862 - accuracy: 0.5895 - val_loss: 0.9420 - val_accuracy: 0.5969 Epoch 75/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9830 - accuracy: 0.5947 - val_loss: 0.9523 - val_accuracy: 0.6335 Epoch 76/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9822 - accuracy: 0.6013 - val_loss: 0.9443 - val_accuracy: 0.6073 Epoch 77/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9805 - accuracy: 0.5816 - val_loss: 0.9414 - val_accuracy: 0.5916 Epoch 78/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9815 - accuracy: 0.5908 - val_loss: 0.9367 - val_accuracy: 0.5969 Epoch 79/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9767 - accuracy: 0.5882 - val_loss: 0.9387 - val_accuracy: 0.6021 Epoch 80/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9782 - accuracy: 0.5947 - val_loss: 0.9458 - val_accuracy: 0.6126 Epoch 81/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9780 - accuracy: 0.5908 - val_loss: 0.9363 - val_accuracy: 0.5969 Epoch 82/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9731 - accuracy: 0.5974 - val_loss: 0.9339 - val_accuracy: 0.5916 Epoch 83/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9727 - accuracy: 0.5816 - val_loss: 0.9363 - val_accuracy: 0.6021 Epoch 84/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9739 - accuracy: 0.5921 - val_loss: 0.9351 - val_accuracy: 0.6021 Epoch 85/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9711 - accuracy: 0.5961 - val_loss: 0.9320 - val_accuracy: 0.5812 Epoch 86/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9716 - accuracy: 0.5816 - val_loss: 0.9356 - val_accuracy: 0.6021 Epoch 87/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9653 - accuracy: 0.6066 - val_loss: 0.9676 - val_accuracy: 0.6021 Epoch 88/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9728 - accuracy: 0.5855 - val_loss: 0.9363 - val_accuracy: 0.6283 Epoch 89/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9666 - accuracy: 0.5947 - val_loss: 0.9349 - val_accuracy: 0.6283 Epoch 90/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9683 - accuracy: 0.5934 - val_loss: 0.9296 - val_accuracy: 0.5864 Epoch 91/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9646 - accuracy: 0.5974 - val_loss: 0.9301 - val_accuracy: 0.5812 Epoch 92/100 38/38 [==============================] - 0s 4ms/step - loss: 0.9656 - accuracy: 0.5895 - val_loss: 0.9286 - val_accuracy: 0.5969 Epoch 93/100 38/38 [==============================] - 0s 4ms/step - loss: 0.9638 - accuracy: 0.5987 - val_loss: 0.9446 - val_accuracy: 0.6283 Epoch 94/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9608 - accuracy: 0.5961 - val_loss: 0.9286 - val_accuracy: 0.5916 Epoch 95/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9658 - accuracy: 0.5961 - val_loss: 0.9280 - val_accuracy: 0.6021 Epoch 96/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9585 - accuracy: 0.6000 - val_loss: 0.9287 - val_accuracy: 0.6021 Epoch 97/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9618 - accuracy: 0.6026 - val_loss: 0.9331 - val_accuracy: 0.6230 Epoch 98/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9547 - accuracy: 0.5987 - val_loss: 0.9297 - val_accuracy: 0.6021 Epoch 99/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9626 - accuracy: 0.6013 - val_loss: 0.9234 - val_accuracy: 0.5812 Epoch 100/100 38/38 [==============================] - 0s 3ms/step - loss: 0.9586 - accuracy: 0.6013 - val_loss: 0.9262 - val_accuracy: 0.6073
# Capturing learning history per epoch
hist_keras = pd.DataFrame(history_keras.history)
hist_keras['epoch'] = history_keras.epoch
# Plotting Loss at different epochs
plt.title('Training Loss vs Validation Loss',fontsize=15,color="green")
plt.plot(hist_keras['loss'])
plt.plot(hist_keras['val_loss'])
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(("training" , "validation") , loc ='best')
plt.show()
# Plotting Accuracy at different epochs
plt.title('Training Accuracy vs Validation Accuracy',fontsize=15,color="green")
plt.plot(hist_keras['accuracy'])
plt.plot(hist_keras['val_accuracy'])
plt.ylabel('accuracy')
plt.xlabel('Epoch')
plt.legend(("training" , "validation") , loc ='best')
plt.show()
# calculate score of training data
model_keras.evaluate(X_train, y_cat_train, batch_size=20, verbose=1)
48/48 [==============================] - 0s 2ms/step - loss: 0.9469 - accuracy: 0.6078
[0.9469315409660339, 0.6077812910079956]
# calculate score of testing data
model_keras.evaluate(X_test, y_cat_test, batch_size=20, verbose=1)
21/21 [==============================] - 0s 2ms/step - loss: 1.0047 - accuracy: 0.5931
[1.0047204494476318, 0.593137264251709]
# Predicting for X_test
y_pred_keras = model_keras.predict(X_test)
y_pred_keras
13/13 [==============================] - 0s 2ms/step
array([[1.8887123e-04, 1.6787344e-04, 1.3803072e-04, ..., 1.8187954e-01,
9.0554105e-03, 4.5836507e-03],
[2.9591320e-04, 2.8368965e-04, 2.4793879e-04, ..., 3.2496709e-01,
3.1332456e-02, 9.5211444e-03],
[2.2973996e-04, 2.1991009e-04, 2.7420151e-04, ..., 4.6292165e-01,
4.5346698e-01, 2.4619879e-02],
...,
[3.2492119e-04, 3.2192259e-04, 3.5399600e-04, ..., 5.5859345e-01,
2.6717067e-01, 2.3405660e-02],
[3.5693907e-04, 3.3271729e-04, 3.3872898e-04, ..., 4.6509126e-01,
7.1178176e-02, 1.5960392e-02],
[2.1294493e-04, 1.9088805e-04, 1.5998697e-04, ..., 2.1068053e-01,
1.1996112e-02, 5.5889399e-03]], dtype=float32)
y_pred_keras_final = []
for i in y_pred_keras:
y_pred_keras_final.append(np.argmax(i))
print(y_pred_keras_final)
[5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 5, 6, 5, 5, 6, 5, 5, 5, 6, 5, 5, 6, 5, 5, 6, 5, 5, 7, 5, 6, 6, 5, 6, 5, 5, 6, 7, 5, 5, 7, 5, 6, 5, 6, 6, 5, 6, 6, 6, 6, 5, 5, 6, 6, 6, 5, 6, 5, 5, 5, 7, 6, 6, 5, 6, 5, 6, 5, 6, 6, 6, 5, 6, 6, 6, 5, 6, 5, 6, 6, 5, 6, 6, 5, 5, 6, 6, 5, 6, 6, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 6, 5, 6, 5, 5, 6, 5, 6, 5, 7, 5, 5, 6, 6, 5, 6, 6, 6, 5, 7, 5, 6, 7, 6, 5, 6, 5, 6, 5, 6, 6, 5, 5, 6, 5, 6, 5, 5, 6, 6, 5, 5, 5, 6, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 6, 5, 6, 6, 5, 6, 5, 5, 5, 6, 6, 5, 5, 5, 6, 6, 6, 5, 5, 6, 6, 5, 5, 6, 5, 6, 5, 5, 7, 6, 5, 6, 5, 5, 6, 5, 6, 6, 7, 6, 6, 6, 6, 5, 6, 5, 5, 6, 6, 6, 6, 6, 5, 7, 6, 5, 5, 6, 6, 5, 5, 5, 5, 6, 6, 5, 5, 6, 6, 5, 7, 5, 5, 5, 6, 5, 5, 6, 6, 6, 5, 5, 5, 6, 5, 5, 5, 6, 6, 5, 6, 5, 6, 6, 6, 6, 5, 5, 5, 5, 7, 5, 6, 6, 5, 6, 5, 6, 6, 5, 6, 5, 5, 6, 6, 5, 5, 5, 6, 6, 5, 5, 7, 5, 5, 6, 6, 5, 5, 5, 5, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 5, 6, 6, 5, 7, 5, 5, 5, 7, 5, 6, 6, 6, 6, 5, 5, 6, 6, 5, 5, 5, 5, 6, 6, 5, 6, 5, 5, 6, 5, 5, 6, 5, 5, 6, 6, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 6, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, 6, 5, 6, 6, 5, 5, 5, 6, 6, 7, 5, 6, 6, 6, 5, 5, 5, 5, 6, 6, 5, 5, 6, 5, 6, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 6, 6, 5]
print('Classification Report')
print(classification_report(y_test, y_pred_keras_final))
Classification Report
precision recall f1-score support
3 0.00 0.00 0.00 3
4 0.00 0.00 0.00 16
5 0.65 0.76 0.70 173
6 0.53 0.63 0.58 161
7 0.56 0.18 0.27 50
8 0.00 0.00 0.00 5
accuracy 0.59 408
macro avg 0.29 0.26 0.26 408
weighted avg 0.56 0.59 0.56 408
cm = confusion_matrix(y_test.tolist(), y_pred_keras_final)
plt.figure(figsize=(10, 7))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=[3, 4, 5, 6, 7, 8], yticklabels=[3, 4, 5, 6, 7, 8])
plt.xlabel('Predicted')
plt.ylabel('Truth')
plt.show()
# svhn_hf=h5py.File('/content/drive/MyDrive/GL/Autonomous_Vehicles_SVHN_single_grey1.h5','r')
svhn_hf = h5py.File('Autonomous_Vehicles_SVHN_single_grey1.h5', 'r')
svhn_hf
<HDF5 file "Autonomous_Vehicles_SVHN_single_grey1.h5" (mode r)>
svhn_hf.keys()
<KeysViewHDF5 ['X_test', 'X_train', 'X_val', 'y_test', 'y_train', 'y_val']>
Different keys are present, i.e.:
X_svhn_train = svhn_hf['X_train'][:]
y_svhn_train = svhn_hf['y_train'][:]
X_svhn_val = svhn_hf['X_val'][:]
X_svhn_test = svhn_hf['X_test'][:]
y_svhn_test = svhn_hf['y_test'][:]
y_svhn_val = svhn_hf['y_val'][:]
svhn_hf.close()
print('X_train:', X_svhn_train.shape)
print('y_train:', y_svhn_train.shape)
print('X_test:', X_svhn_test.shape)
print('y_test:', y_svhn_test.shape)
print('X_val:', X_svhn_val.shape)
print('y_val:', y_svhn_val.shape)
X_train: (42000, 32, 32) y_train: (42000,) X_test: (18000, 32, 32) y_test: (18000,) X_val: (60000, 32, 32) y_val: (60000,)
All datasets are in sync with records and features for all train, test and val set.
fig=plt.figure(figsize=(15,7))
for i in range(0,10):
ax=fig.add_subplot(2,5,i+1)
plt.title(y_svhn_train[i], fontsize=30, color="green") #labels
plt.imshow(X_svhn_train[i], cmap='gray')
plt.tight_layout()
plt.show()
X_svhn_train=X_svhn_train.reshape(X_svhn_train.shape[0], -1)
X_svhn_test=X_svhn_test.reshape(X_svhn_test.shape[0], -1)
X_svhn_val=X_svhn_val.reshape(X_svhn_val.shape[0], -1)
print('X_train:', X_svhn_train.shape)
print('X_test:', X_svhn_test.shape)
print('X_val:', X_svhn_val.shape)
X_train: (42000, 1024) X_test: (18000, 1024) X_val: (60000, 1024)
#As the pixel values range from 0 to 256, apart from 0 the range is 255. So dividing all the values by 255 will convert it to range from 0 to 1.
X_svhn_train=X_svhn_train.astype('float32')/255.0
X_svhn_test=X_svhn_test.astype('float32')/255.0
X_svhn_val=X_svhn_val.astype('float32')/255.0
# Convert to "one-hot" vectors using the to_categorical function
num_classes = 10
y_svhn_train = to_categorical(y_svhn_train, num_classes)
y_svhn_val = to_categorical(y_svhn_val, num_classes)
y_svhn_test_cat=to_categorical(y_svhn_test,num_classes)
print('y_train:', y_svhn_train.shape)
print('y_test_cat:', y_svhn_test_cat.shape)
print('y_val:', y_svhn_val.shape)
y_train: (42000, 10) y_test_cat: (18000, 10) y_val: (60000, 10)
print('X_train:', X_svhn_train.shape)
print('y_train:', y_svhn_train.shape)
print('X_test:', X_svhn_test.shape)
print('y_test:', y_svhn_test_cat.shape)
print('X_val:', X_svhn_val.shape)
print('y_val:', y_svhn_val.shape)
X_train: (42000, 1024) y_train: (42000, 10) X_test: (18000, 1024) y_test: (18000, 10) X_val: (60000, 1024) y_val: (60000, 10)
#Classes present for target class
print(pd.DataFrame(y_svhn_train).columns)
RangeIndex(start=0, stop=10, step=1)
Classes are present for : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
backend.clear_session()
tf.random.set_seed(random_state)
# create model
svhn_model = Sequential()
svhn_model.add(Dense(256, activation='relu',kernel_initializer='he_normal',input_shape=(32*32,))) ###Multiple Dense units with Relu activation
svhn_model.add(BatchNormalization())
svhn_model.add(Dense(128, activation='relu',kernel_initializer='he_normal'))
svhn_model.add(BatchNormalization())
svhn_model.add(Dense(64, activation='relu',kernel_initializer='he_normal'))
svhn_model.add(BatchNormalization())
svhn_model.add(Dense(64, activation='relu',kernel_initializer='he_normal'))
svhn_model.add(BatchNormalization())
svhn_model.add(Dense(32, activation='relu',kernel_initializer='he_normal'))
svhn_model.add(BatchNormalization())
svhn_model.add(Dense(num_classes,activation='softmax')) ### For multiclass classification Softmax is used
# Compile model
adam = optimizers.Adam(learning_rate=1e-5)
svhn_model.compile(loss=losses.categorical_crossentropy, optimizer=adam, metrics=['accuracy']) ### Loss function = Categorical cross entropy
## Looking into our base model
svhn_model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 256) 262400
batch_normalization (BatchN (None, 256) 1024
ormalization)
dense_1 (Dense) (None, 128) 32896
batch_normalization_1 (Batc (None, 128) 512
hNormalization)
dense_2 (Dense) (None, 64) 8256
batch_normalization_2 (Batc (None, 64) 256
hNormalization)
dense_3 (Dense) (None, 64) 4160
batch_normalization_3 (Batc (None, 64) 256
hNormalization)
dense_4 (Dense) (None, 32) 2080
batch_normalization_4 (Batc (None, 32) 128
hNormalization)
dense_5 (Dense) (None, 10) 330
=================================================================
Total params: 312,298
Trainable params: 311,210
Non-trainable params: 1,088
_________________________________________________________________
# Fit the model
svhn_history=svhn_model.fit(X_svhn_train, y_svhn_train, validation_data=(X_svhn_val, y_svhn_val) , epochs=100, batch_size=100, verbose=1)
Epoch 1/100 420/420 [==============================] - 7s 12ms/step - loss: 2.7065 - accuracy: 0.1136 - val_loss: 2.4908 - val_accuracy: 0.1268 Epoch 2/100 420/420 [==============================] - 4s 10ms/step - loss: 2.5273 - accuracy: 0.1406 - val_loss: 2.4866 - val_accuracy: 0.1575 Epoch 3/100 420/420 [==============================] - 4s 11ms/step - loss: 2.4153 - accuracy: 0.1671 - val_loss: 2.3666 - val_accuracy: 0.1813 Epoch 4/100 420/420 [==============================] - 4s 10ms/step - loss: 2.3139 - accuracy: 0.1942 - val_loss: 2.2806 - val_accuracy: 0.2086 Epoch 5/100 420/420 [==============================] - 4s 10ms/step - loss: 2.2250 - accuracy: 0.2225 - val_loss: 2.1843 - val_accuracy: 0.2371 Epoch 6/100 420/420 [==============================] - 4s 10ms/step - loss: 2.1448 - accuracy: 0.2526 - val_loss: 2.1061 - val_accuracy: 0.2640 Epoch 7/100 420/420 [==============================] - 4s 10ms/step - loss: 2.0655 - accuracy: 0.2799 - val_loss: 2.0279 - val_accuracy: 0.2985 Epoch 8/100 420/420 [==============================] - 4s 10ms/step - loss: 1.9917 - accuracy: 0.3097 - val_loss: 1.9530 - val_accuracy: 0.3319 Epoch 9/100 420/420 [==============================] - 4s 10ms/step - loss: 1.9228 - accuracy: 0.3385 - val_loss: 1.8752 - val_accuracy: 0.3607 Epoch 10/100 420/420 [==============================] - 4s 10ms/step - loss: 1.8581 - accuracy: 0.3654 - val_loss: 1.8042 - val_accuracy: 0.3915 Epoch 11/100 420/420 [==============================] - 4s 10ms/step - loss: 1.7970 - accuracy: 0.3904 - val_loss: 1.7470 - val_accuracy: 0.4192 Epoch 12/100 420/420 [==============================] - 4s 10ms/step - loss: 1.7428 - accuracy: 0.4182 - val_loss: 1.6928 - val_accuracy: 0.4430 Epoch 13/100 420/420 [==============================] - 4s 10ms/step - loss: 1.6866 - accuracy: 0.4415 - val_loss: 1.6278 - val_accuracy: 0.4689 Epoch 14/100 420/420 [==============================] - 4s 10ms/step - loss: 1.6331 - accuracy: 0.4640 - val_loss: 1.5885 - val_accuracy: 0.4824 Epoch 15/100 420/420 [==============================] - 4s 11ms/step - loss: 1.5874 - accuracy: 0.4826 - val_loss: 1.5396 - val_accuracy: 0.5059 Epoch 16/100 420/420 [==============================] - 4s 10ms/step - loss: 1.5417 - accuracy: 0.5030 - val_loss: 1.4969 - val_accuracy: 0.5268 Epoch 17/100 420/420 [==============================] - 4s 10ms/step - loss: 1.4994 - accuracy: 0.5205 - val_loss: 1.4759 - val_accuracy: 0.5344 Epoch 18/100 420/420 [==============================] - 4s 10ms/step - loss: 1.4597 - accuracy: 0.5336 - val_loss: 1.4150 - val_accuracy: 0.5543 Epoch 19/100 420/420 [==============================] - 4s 11ms/step - loss: 1.4261 - accuracy: 0.5469 - val_loss: 1.3780 - val_accuracy: 0.5713 Epoch 20/100 420/420 [==============================] - 4s 11ms/step - loss: 1.3857 - accuracy: 0.5645 - val_loss: 1.3324 - val_accuracy: 0.5901 Epoch 21/100 420/420 [==============================] - 4s 11ms/step - loss: 1.3549 - accuracy: 0.5776 - val_loss: 1.3037 - val_accuracy: 0.6013 Epoch 22/100 420/420 [==============================] - 4s 11ms/step - loss: 1.3234 - accuracy: 0.5884 - val_loss: 1.2772 - val_accuracy: 0.6098 Epoch 23/100 420/420 [==============================] - 4s 11ms/step - loss: 1.2923 - accuracy: 0.5993 - val_loss: 1.2412 - val_accuracy: 0.6204 Epoch 24/100 420/420 [==============================] - 4s 11ms/step - loss: 1.2625 - accuracy: 0.6109 - val_loss: 1.2178 - val_accuracy: 0.6297 Epoch 25/100 420/420 [==============================] - 4s 11ms/step - loss: 1.2407 - accuracy: 0.6180 - val_loss: 1.1985 - val_accuracy: 0.6365 Epoch 26/100 420/420 [==============================] - 5s 11ms/step - loss: 1.2140 - accuracy: 0.6282 - val_loss: 1.1666 - val_accuracy: 0.6485 Epoch 27/100 420/420 [==============================] - 4s 11ms/step - loss: 1.1905 - accuracy: 0.6337 - val_loss: 1.1438 - val_accuracy: 0.6533 Epoch 28/100 420/420 [==============================] - 5s 11ms/step - loss: 1.1700 - accuracy: 0.6427 - val_loss: 1.1312 - val_accuracy: 0.6613 Epoch 29/100 420/420 [==============================] - 4s 11ms/step - loss: 1.1498 - accuracy: 0.6493 - val_loss: 1.1006 - val_accuracy: 0.6679 Epoch 30/100 420/420 [==============================] - 5s 11ms/step - loss: 1.1320 - accuracy: 0.6553 - val_loss: 1.0848 - val_accuracy: 0.6731 Epoch 31/100 420/420 [==============================] - 4s 11ms/step - loss: 1.1142 - accuracy: 0.6583 - val_loss: 1.0698 - val_accuracy: 0.6761 Epoch 32/100 420/420 [==============================] - 4s 11ms/step - loss: 1.0979 - accuracy: 0.6652 - val_loss: 1.0552 - val_accuracy: 0.6817 Epoch 33/100 420/420 [==============================] - 5s 11ms/step - loss: 1.0834 - accuracy: 0.6680 - val_loss: 1.0356 - val_accuracy: 0.6880 Epoch 34/100 420/420 [==============================] - 4s 11ms/step - loss: 1.0653 - accuracy: 0.6742 - val_loss: 1.0205 - val_accuracy: 0.6932 Epoch 35/100 420/420 [==============================] - 4s 11ms/step - loss: 1.0525 - accuracy: 0.6785 - val_loss: 1.0147 - val_accuracy: 0.6941 Epoch 36/100 420/420 [==============================] - 5s 11ms/step - loss: 1.0385 - accuracy: 0.6833 - val_loss: 0.9935 - val_accuracy: 0.7001 Epoch 37/100 420/420 [==============================] - 4s 11ms/step - loss: 1.0261 - accuracy: 0.6854 - val_loss: 0.9811 - val_accuracy: 0.7034 Epoch 38/100 420/420 [==============================] - 4s 11ms/step - loss: 1.0111 - accuracy: 0.6910 - val_loss: 0.9721 - val_accuracy: 0.7075 Epoch 39/100 420/420 [==============================] - 4s 11ms/step - loss: 1.0023 - accuracy: 0.6927 - val_loss: 0.9501 - val_accuracy: 0.7139 Epoch 40/100 420/420 [==============================] - 4s 11ms/step - loss: 0.9908 - accuracy: 0.6953 - val_loss: 0.9450 - val_accuracy: 0.7141 Epoch 41/100 420/420 [==============================] - 5s 11ms/step - loss: 0.9805 - accuracy: 0.7016 - val_loss: 0.9359 - val_accuracy: 0.7168 Epoch 42/100 420/420 [==============================] - 4s 11ms/step - loss: 0.9699 - accuracy: 0.7026 - val_loss: 0.9274 - val_accuracy: 0.7199 Epoch 43/100 420/420 [==============================] - 5s 11ms/step - loss: 0.9602 - accuracy: 0.7050 - val_loss: 0.9254 - val_accuracy: 0.7191 Epoch 44/100 420/420 [==============================] - 4s 11ms/step - loss: 0.9477 - accuracy: 0.7093 - val_loss: 0.9014 - val_accuracy: 0.7278 Epoch 45/100 420/420 [==============================] - 5s 12ms/step - loss: 0.9411 - accuracy: 0.7114 - val_loss: 0.8937 - val_accuracy: 0.7310 Epoch 46/100 420/420 [==============================] - 5s 12ms/step - loss: 0.9303 - accuracy: 0.7141 - val_loss: 0.8905 - val_accuracy: 0.7299 Epoch 47/100 420/420 [==============================] - 5s 12ms/step - loss: 0.9176 - accuracy: 0.7188 - val_loss: 0.8754 - val_accuracy: 0.7359 Epoch 48/100 420/420 [==============================] - 5s 12ms/step - loss: 0.9148 - accuracy: 0.7164 - val_loss: 0.8886 - val_accuracy: 0.7285 Epoch 49/100 420/420 [==============================] - 5s 12ms/step - loss: 0.9033 - accuracy: 0.7239 - val_loss: 0.8625 - val_accuracy: 0.7376 Epoch 50/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8975 - accuracy: 0.7237 - val_loss: 0.8550 - val_accuracy: 0.7389 Epoch 51/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8884 - accuracy: 0.7259 - val_loss: 0.8527 - val_accuracy: 0.7418 Epoch 52/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8823 - accuracy: 0.7291 - val_loss: 0.8484 - val_accuracy: 0.7408 Epoch 53/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8725 - accuracy: 0.7298 - val_loss: 0.8432 - val_accuracy: 0.7445 Epoch 54/100 420/420 [==============================] - 6s 13ms/step - loss: 0.8703 - accuracy: 0.7308 - val_loss: 0.8265 - val_accuracy: 0.7495 Epoch 55/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8611 - accuracy: 0.7349 - val_loss: 0.8194 - val_accuracy: 0.7515 Epoch 56/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8540 - accuracy: 0.7365 - val_loss: 0.8252 - val_accuracy: 0.7483 Epoch 57/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8473 - accuracy: 0.7392 - val_loss: 0.8076 - val_accuracy: 0.7545 Epoch 58/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8391 - accuracy: 0.7406 - val_loss: 0.8093 - val_accuracy: 0.7533 Epoch 59/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8365 - accuracy: 0.7432 - val_loss: 0.8062 - val_accuracy: 0.7537 Epoch 60/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8297 - accuracy: 0.7430 - val_loss: 0.7930 - val_accuracy: 0.7590 Epoch 61/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8257 - accuracy: 0.7447 - val_loss: 0.8002 - val_accuracy: 0.7553 Epoch 62/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8175 - accuracy: 0.7474 - val_loss: 0.7889 - val_accuracy: 0.7585 Epoch 63/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8109 - accuracy: 0.7491 - val_loss: 0.7885 - val_accuracy: 0.7595 Epoch 64/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8044 - accuracy: 0.7509 - val_loss: 0.7779 - val_accuracy: 0.7619 Epoch 65/100 420/420 [==============================] - 5s 12ms/step - loss: 0.8031 - accuracy: 0.7522 - val_loss: 0.7689 - val_accuracy: 0.7647 Epoch 66/100 420/420 [==============================] - 5s 11ms/step - loss: 0.7944 - accuracy: 0.7536 - val_loss: 0.7695 - val_accuracy: 0.7653 Epoch 67/100 420/420 [==============================] - 5s 11ms/step - loss: 0.7904 - accuracy: 0.7550 - val_loss: 0.7716 - val_accuracy: 0.7630 Epoch 68/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7838 - accuracy: 0.7571 - val_loss: 0.7655 - val_accuracy: 0.7648 Epoch 69/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7791 - accuracy: 0.7584 - val_loss: 0.7520 - val_accuracy: 0.7705 Epoch 70/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7751 - accuracy: 0.7601 - val_loss: 0.7606 - val_accuracy: 0.7671 Epoch 71/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7688 - accuracy: 0.7604 - val_loss: 0.7409 - val_accuracy: 0.7737 Epoch 72/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7651 - accuracy: 0.7619 - val_loss: 0.7383 - val_accuracy: 0.7745 Epoch 73/100 420/420 [==============================] - 5s 11ms/step - loss: 0.7581 - accuracy: 0.7655 - val_loss: 0.7279 - val_accuracy: 0.7778 Epoch 74/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7554 - accuracy: 0.7656 - val_loss: 0.7312 - val_accuracy: 0.7766 Epoch 75/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7517 - accuracy: 0.7675 - val_loss: 0.7191 - val_accuracy: 0.7807 Epoch 76/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7460 - accuracy: 0.7691 - val_loss: 0.7226 - val_accuracy: 0.7789 Epoch 77/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7425 - accuracy: 0.7689 - val_loss: 0.7184 - val_accuracy: 0.7804 Epoch 78/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7360 - accuracy: 0.7715 - val_loss: 0.7140 - val_accuracy: 0.7816 Epoch 79/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7312 - accuracy: 0.7716 - val_loss: 0.7049 - val_accuracy: 0.7851 Epoch 80/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7326 - accuracy: 0.7728 - val_loss: 0.7053 - val_accuracy: 0.7834 Epoch 81/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7270 - accuracy: 0.7737 - val_loss: 0.7018 - val_accuracy: 0.7865 Epoch 82/100 420/420 [==============================] - 6s 13ms/step - loss: 0.7247 - accuracy: 0.7737 - val_loss: 0.6979 - val_accuracy: 0.7864 Epoch 83/100 420/420 [==============================] - 5s 12ms/step - loss: 0.7145 - accuracy: 0.7788 - val_loss: 0.6963 - val_accuracy: 0.7871 Epoch 84/100 420/420 [==============================] - 5s 11ms/step - loss: 0.7093 - accuracy: 0.7807 - val_loss: 0.6868 - val_accuracy: 0.7910 Epoch 85/100 420/420 [==============================] - 5s 11ms/step - loss: 0.7077 - accuracy: 0.7794 - val_loss: 0.6879 - val_accuracy: 0.7910 Epoch 86/100 420/420 [==============================] - 4s 11ms/step - loss: 0.7090 - accuracy: 0.7815 - val_loss: 0.6873 - val_accuracy: 0.7897 Epoch 87/100 420/420 [==============================] - 4s 11ms/step - loss: 0.7010 - accuracy: 0.7817 - val_loss: 0.6841 - val_accuracy: 0.7894 Epoch 88/100 420/420 [==============================] - 4s 11ms/step - loss: 0.6985 - accuracy: 0.7817 - val_loss: 0.6832 - val_accuracy: 0.7905 Epoch 89/100 420/420 [==============================] - 4s 11ms/step - loss: 0.6961 - accuracy: 0.7827 - val_loss: 0.6780 - val_accuracy: 0.7922 Epoch 90/100 420/420 [==============================] - 5s 11ms/step - loss: 0.6938 - accuracy: 0.7846 - val_loss: 0.6784 - val_accuracy: 0.7926 Epoch 91/100 420/420 [==============================] - 5s 11ms/step - loss: 0.6854 - accuracy: 0.7869 - val_loss: 0.6699 - val_accuracy: 0.7944 Epoch 92/100 420/420 [==============================] - 4s 11ms/step - loss: 0.6846 - accuracy: 0.7868 - val_loss: 0.6655 - val_accuracy: 0.7969 Epoch 93/100 420/420 [==============================] - 5s 11ms/step - loss: 0.6827 - accuracy: 0.7871 - val_loss: 0.6632 - val_accuracy: 0.7976 Epoch 94/100 420/420 [==============================] - 4s 11ms/step - loss: 0.6789 - accuracy: 0.7892 - val_loss: 0.6674 - val_accuracy: 0.7943 Epoch 95/100 420/420 [==============================] - 4s 11ms/step - loss: 0.6674 - accuracy: 0.7949 - val_loss: 0.6511 - val_accuracy: 0.8014 Epoch 96/100 420/420 [==============================] - 5s 11ms/step - loss: 0.6698 - accuracy: 0.7920 - val_loss: 0.6500 - val_accuracy: 0.8009 Epoch 97/100 420/420 [==============================] - 4s 11ms/step - loss: 0.6658 - accuracy: 0.7918 - val_loss: 0.6428 - val_accuracy: 0.8043 Epoch 98/100 420/420 [==============================] - 5s 11ms/step - loss: 0.6664 - accuracy: 0.7938 - val_loss: 0.6545 - val_accuracy: 0.7989 Epoch 99/100 420/420 [==============================] - 4s 11ms/step - loss: 0.6613 - accuracy: 0.7937 - val_loss: 0.6483 - val_accuracy: 0.8009 Epoch 100/100 420/420 [==============================] - 5s 11ms/step - loss: 0.6557 - accuracy: 0.7942 - val_loss: 0.6435 - val_accuracy: 0.8034
# Capturing learning history per epoch
svhn_hist = pd.DataFrame(svhn_history.history)
svhn_hist['epoch'] = svhn_history.epoch
# Plotting Loss at different epochs
plt.title('Training Loss vs Validation Loss',fontsize=15,color="green")
plt.plot(svhn_hist['loss'])
plt.plot(svhn_hist['val_loss'])
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(("training" , "validation") , loc ='best')
plt.show()
# Plotting Accuracy at different epochs
plt.title('Training Accuracy vs Validation Accuracy',fontsize=15,color="green")
plt.plot(svhn_hist['accuracy'])
plt.plot(svhn_hist['val_accuracy'])
plt.ylabel('accuracy')
plt.xlabel('Epoch')
plt.legend(("training" , "validation") , loc ='best')
plt.show()
# calculate score of training data
svhn_model.evaluate(X_svhn_train, y_svhn_train, batch_size=100, verbose=1)
420/420 [==============================] - 1s 3ms/step - loss: 0.5871 - accuracy: 0.8202
[0.5870670676231384, 0.8201666474342346]
# calculate score of testing data
svhn_model.evaluate(X_svhn_test, y_svhn_test_cat, batch_size=100, verbose=1)
180/180 [==============================] - 0s 3ms/step - loss: 0.7751 - accuracy: 0.7642
[0.7750727534294128, 0.7642222046852112]
# Predicting for X_test
y_svhn_pred=svhn_model.predict(X_svhn_test)
y_svhn_pred
563/563 [==============================] - 1s 2ms/step
array([[3.4577098e-01, 1.6166454e-02, 3.1618235e-01, ..., 9.2613786e-02,
6.2088434e-02, 1.2856001e-01],
[4.1881553e-04, 8.6624026e-03, 4.6452436e-01, ..., 5.0947154e-01,
8.3934190e-04, 5.9603684e-04],
[1.2797548e-04, 5.8346872e-05, 9.9713898e-01, ..., 1.3466383e-03,
6.6302385e-04, 7.9395650e-05],
...,
[1.3367975e-03, 5.4388600e-03, 1.0670007e-03, ..., 9.9128717e-01,
2.4241621e-05, 1.4755127e-04],
[1.7010840e-02, 9.5398095e-04, 8.0615020e-04, ..., 5.0044339e-04,
5.5240942e-03, 9.6345818e-01],
[6.2140054e-04, 1.1670088e-03, 9.7285199e-01, ..., 5.0526974e-03,
1.5521442e-03, 1.2643705e-03]], dtype=float32)
y_svhn_pred_final=[]
for i in y_svhn_pred:
y_svhn_pred_final.append(np.argmax(i))
print(y_svhn_pred_final)
[0, 7, 2, 9, 0, 9, 1, 5, 1, 4, 8, 3, 4, 4, 5, 5, 8, 6, 4, 5, 0, 6, 5, 8, 2, 3, 0, 2, 9, 5, 2, 8, 9, 1, 0, 9, 5, 3, 3, 7, 0, 4, 2, 4, 9, 4, 2, 8, 8, 3, 5, 3, 7, 1, 4, 8, 4, 1, 2, 9, 0, 1, 5, 9, 9, 2, 2, 1, 8, 8, 9, 8, 3, 8, 4, 5, 2, 8, 6, 5, 5, 4, 2, 8, 2, 4, 0, 9, 9, 5, 6, 2, 0, 1, 0, 7, 6, 4, 8, 7, 7, 7, 3, 2, 1, 4, 9, 6, 1, 4, 1, 0, 9, 0, 8, 4, 4, 1, 0, 9, 6, 3, 9, 0, 5, 0, 2, 5, 6, 1, 6, 6, 6, 9, 4, 9, 8, 8, 6, 4, 7, 2, 3, 5, 5, 0, 0, 0, 9, 8, 3, 8, 8, 9, 4, 4, 8, 4, 7, 7, 0, 6, 2, 8, 9, 2, 7, 9, 7, 1, 5, 2, 9, 0, 4, 5, 1, 1, 5, 5, 3, 2, 9, 0, 1, 9, 0, 3, 8, 9, 6, 8, 4, 9, 3, 2, 7, 8, 6, 3, 3, 5, 2, 9, 0, 2, 1, 8, 2, 8, 9, 5, 2, 0, 2, 9, 0, 2, 0, 9, 5, 1, 1, 4, 8, 9, 6, 0, 9, 3, 3, 8, 8, 3, 0, 8, 6, 7, 7, 3, 8, 7, 7, 3, 9, 0, 8, 4, 1, 3, 3, 1, 0, 1, 5, 7, 0, 0, 8, 2, 4, 6, 4, 9, 7, 7, 9, 1, 6, 2, 9, 4, 5, 0, 0, 7, 7, 0, 0, 9, 6, 3, 7, 7, 8, 6, 3, 2, 5, 2, 5, 4, 3, 0, 9, 1, 4, 5, 5, 5, 9, 7, 7, 3, 5, 0, 8, 3, 1, 4, 8, 6, 0, 3, 3, 2, 6, 7, 0, 1, 0, 6, 5, 4, 2, 1, 0, 7, 7, 0, 6, 3, 8, 2, 2, 6, 8, 7, 4, 0, 7, 7, 8, 7, 0, 5, 1, 2, 8, 8, 4, 2, 7, 3, 7, 2, 3, 0, 2, 9, 3, 1, 2, 9, 5, 3, 9, 1, 7, 3, 8, 4, 4, 3, 6, 3, 8, 5, 1, 1, 3, 7, 8, 8, 8, 5, 9, 7, 3, 2, 8, 0, 0, 8, 9, 6, 3, 7, 9, 4, 6, 5, 1, 2, 2, 4, 3, 1, 2, 9, 4, 1, 5, 9, 0, 3, 1, 5, 3, 9, 3, 5, 9, 8, 4, 7, 0, 0, 9, 6, 5, 9, 0, 4, 9, 4, 7, 4, 6, 5, 5, 3, 5, 5, 0, 3, 8, 3, 7, 0, 5, 4, 0, 5, 0, 0, 9, 0, 4, 5, 8, 0, 7, 7, 8, 6, 5, 7, 6, 1, 8, 9, 3, 2, 3, 9, 4, 9, 5, 3, 7, 6, 2, 7, 1, 9, 0, 9, 7, 6, 5, 0, 2, 1, 6, 5, 1, 7, 8, 0, 5, 6, 4, 1, 6, 8, 5, 3, 1, 5, 2, 4, 6, 6, 7, 8, 3, 8, 8, 5, 2, 0, 8, 3, 8, 9, 4, 0, 3, 4, 2, 9, 6, 9, 0, 0, 7, 5, 1, 0, 7, 7, 9, 1, 2, 0, 8, 8, 3, 3, 1, 0, 8, 3, 3, 1, 0, 9, 6, 7, 0, 4, 9, 9, 7, 0, 7, 8, 3, 7, 8, 8, 0, 8, 0, 4, 5, 9, 3, 8, 6, 9, 7, 8, 0, 7, 5, 2, 8, 7, 6, 5, 3, 4, 1, 6, 4, 8, 6, 9, 5, 8, 4, 6, 1, 5, 6, 6, 3, 6, 1, 2, 8, 0, 9, 0, 6, 0, 9, 6, 4, 7, 7, 1, 9, 4, 4, 9, 7, 7, 4, 5, 6, 5, 4, 7, 4, 8, 9, 9, 8, 7, 3, 7, 6, 2, 8, 8, 2, 6, 9, 6, 0, 5, 4, 3, 7, 7, 7, 4, 8, 0, 1, 2, 5, 0, 1, 3, 3, 5, 5, 7, 2, 4, 0, 1, 2, 1, 6, 0, 4, 4, 9, 6, 9, 1, 7, 8, 6, 5, 7, 8, 8, 2, 8, 0, 8, 1, 6, 2, 3, 6, 6, 6, 2, 5, 3, 8, 6, 2, 3, 7, 1, 0, 9, 6, 7, 4, 5, 1, 9, 8, 8, 0, 0, 4, 8, 1, 4, 6, 0, 1, 5, 5, 4, 2, 5, 7, 1, 7, 1, 8, 7, 7, 4, 2, 0, 0, 0, 1, 2, 1, 0, 4, 3, 0, 0, 1, 2, 3, 8, 2, 9, 9, 4, 5, 2, 1, 7, 0, 1, 0, 8, 6, 1, 5, 7, 3, 3, 2, 7, 7, 1, 9, 9, 8, 1, 3, 2, 2, 8, 7, 1, 8, 8, 3, 7, 2, 9, 3, 9, 5, 7, 1, 2, 4, 3, 8, 6, 4, 1, 8, 9, 5, 6, 0, 8, 0, 3, 7, 1, 0, 7, 7, 7, 0, 6, 4, 1, 4, 2, 7, 1, 2, 6, 6, 3, 7, 4, 6, 5, 4, 8, 0, 4, 3, 0, 2, 0, 2, 2, 8, 7, 4, 9, 6, 2, 3, 7, 9, 0, 9, 8, 8, 7, 6, 4, 2, 9, 0, 6, 3, 7, 6, 4, 0, 5, 3, 1, 6, 9, 8, 9, 9, 3, 1, 0, 5, 7, 5, 0, 8, 2, 1, 9, 7, 3, 5, 2, 4, 0, 0, 4, 1, 1, 3, 7, 1, 5, 9, 8, 8, 2, 8, 3, 9, 7, 4, 3, 4, 4, 7, 0, 9, 6, 6, 8, 3, 3, 2, 6, 2, 1, 0, 5, 1, 0, 1, 0, 2, 1, 6, 3, 7, 2, 6, 8, 8, 1, 3, 4, 8, 7, 3, 5, 6, 7, 0, 0, 5, 5, 4, 8, 0, 8, 0, 6, 8, 0, 3, 3, 2, 9, 2, 6, 7, 7, 0, 3, 5, 0, 4, 4, 7, 3, 5, 7, 4, 6, 9, 9, 9, 1, 1, 5, 2, 7, 1, 9, 1, 7, 2, 0, 2, 2, 7, 5, 2, 5, 2, 2, 2, 2, 0, 5, 3, 8, 6, 7, 1, 8, 5, 2, 2, 3, 8, 2, 6, 7, 2, 0, 0, 0, 4, 0, 4, 6, 8, 1, 0, 5, 8, 0, 8, 7, 3, 8, 8, 6, 2, 1, 6, 5, 2, 3, 0, 3, 6, 7, 5, 8, 9, 5, 1, 0, 8, 3, 6, 9, 9, 8, 9, 8, 8, 3, 0, 0, 9, 1, 8, 0, 7, 3, 9, 7, 5, 7, 3, 2, 6, 9, 9, 3, 2, 5, 5, 7, 6, 3, 7, 6, 1, 0, 5, 1, 4, 8, 4, 1, 6, 6, 3, 6, 1, 2, 7, 1, 8, 8, 7, 0, 7, 4, 0, 3, 7, 7, 7, 9, 6, 5, 8, 6, 7, 4, 9, 5, 7, 8, 5, 8, 9, 5, 3, 8, 7, 3, 2, 6, 7, 9, 5, 7, 0, 3, 9, 6, 5, 5, 5, 2, 8, 0, 4, 4, 0, 2, 1, 9, 2, 0, 0, 2, 4, 3, 7, 9, 5, 3, 3, 5, 9, 5, 9, 4, 9, 1, 2, 4, 3, 9, 7, 0, 7, 8, 5, 7, 1, 6, 4, 7, 5, 2, 2, 3, 6, 8, 3, 4, 8, 0, 5, 3, 5, 7, 2, 7, 8, 9, 4, 2, 6, 6, 8, 7, 7, 2, 0, 2, 3, 6, 4, 5, 0, 4, 8, 1, 5, 6, 6, 0, 3, 8, 1, 7, 3, 4, 9, 0, 9, 9, 1, 1, 5, 8, 1, 5, 5, 5, 5, 6, 0, 6, 4, 4, 7, 1, 7, 7, 8, 8, 5, 9, 0, 3, 1, 1, 7, 1, 9, 5, 8, 7, 0, 5, 1, 6, 6, 2, 3, 2, 4, 3, 5, 3, 3, 1, 9, 4, 1, 4, 4, 8, 4, 0, 1, 1, 5, 1, 4, 2, 8, 6, 0, 9, 6, 9, 8, 8, 2, 5, 9, 4, 3, 7, 0, 0, 4, 4, 4, 8, 1, 3, 1, 4, 2, 4, 3, 4, 8, 8, 7, 3, 6, 2, 7, 9, 2, 3, 3, 8, 9, 9, 0, 0, 3, 9, 0, 8, 7, 3, 1, 2, 3, 9, 6, 3, 4, 5, 3, 1, 4, 5, 6, 6, 3, 8, 5, 1, 5, 2, 8, 4, 6, 9, 3, 4, 0, 0, 0, 0, 1, 2, 7, 8, 4, 5, 3, 6, 1, 7, 7, 6, 3, 3, 6, 0, 6, 5, 8, 2, 2, 3, 6, 3, 4, 7, 5, 2, 0, 0, 0, 9, 0, 2, 9, 7, 6, 9, 2, 2, 4, 1, 9, 7, 4, 8, 0, 8, 0, 5, 2, 3, 3, 7, 7, 2, 9, 7, 2, 6, 8, 2, 1, 7, 5, 6, 8, 3, 9, 3, 3, 4, 1, 0, 6, 6, 5, 0, 6, 5, 5, 0, 9, 3, 7, 6, 2, 7, 0, 1, 8, 7, 5, 4, 1, 8, 6, 6, 6, 0, 0, 6, 8, 2, 5, 5, 6, 6, 6, 2, 4, 1, 5, 6, 9, 1, 9, 4, 0, 9, 5, 4, 4, 9, 9, 3, 7, 9, 1, 2, 0, 6, 3, 5, 5, 3, 1, 3, 1, 2, 3, 7, 2, 6, 9, 6, 4, 1, 1, 0, 1, 9, 6, 9, 8, 5, 8, 9, 0, 7, 9, 2, 4, 0, 4, 4, 3, 7, 5, 2, 0, 2, 4, 4, 3, 5, 0, 5, 2, 1, 8, 9, 3, 7, 4, 8, 5, 0, 8, 8, 4, 1, 8, 2, 8, 3, 6, 0, 6, 2, 8, 7, 8, 0, 8, 8, 3, 2, 1, 1, 6, 1, 4, 9, 4, 7, 5, 0, 3, 0, 8, 3, 4, 0, 7, 0, 2, 0, 3, 3, 0, 4, 5, 1, 3, 6, 7, 7, 5, 6, 1, 6, 9, 4, 8, 0, 6, 3, 9, 0, 5, 1, 7, 4, 2, 3, 7, 2, 7, 7, 0, 4, 9, 9, 1, 8, 7, 2, 1, 2, 0, 2, 1, 7, 4, 7, 0, 1, 3, 4, 4, 7, 8, 0, 1, 6, 1, 6, 9, 6, 4, 9, 3, 9, 2, 4, 7, 6, 7, 3, 2, 7, 7, 4, 4, 8, 4, 3, 4, 0, 2, 4, 7, 7, 3, 3, 8, 3, 2, 0, 0, 6, 8, 8, 8, 0, 1, 7, 9, 4, 1, 1, 1, 5, 5, 1, 7, 8, 0, 6, 2, 6, 0, 1, 9, 3, 4, 1, 9, 5, 5, 5, 6, 3, 3, 3, 4, 9, 1, 2, 7, 6, 3, 9, 6, 9, 2, 5, 7, 0, 2, 4, 8, 7, 2, 4, 7, 6, 7, 6, 4, 7, 5, 2, 9, 5, 1, 1, 0, 6, 2, 5, 6, 6, 4, 2, 2, 1, 9, 9, 6, 5, 5, 6, 5, 0, 6, 5, 8, 0, 4, 3, 3, 8, 4, 1, 1, 8, 3, 2, 7, 4, 4, 2, 1, 1, 7, 4, 5, 0, 4, 5, 0, 8, 0, 3, 9, 5, 1, 7, 8, 1, 7, 5, 5, 1, 4, 6, 0, 8, 4, 4, 6, 3, 3, 4, 8, 3, 4, 4, 0, 4, 3, 5, 2, 8, 1, 5, 8, 0, 0, 7, 2, 7, 5, 6, 2, 7, 1, 1, 6, 6, 5, 5, 8, 2, 1, 3, 8, 6, 8, 3, 4, 1, 2, 2, 5, 0, 1, 0, 1, 6, 2, 5, 4, 6, 5, 7, 0, 8, 2, 8, 1, 4, 0, 5, 3, 1, 2, 5, 0, 1, 9, 7, 2, 6, 1, 7, 2, 9, 0, 5, 0, 2, 4, 9, 7, 1, 5, 7, 8, 4, 4, 1, 0, 8, 0, 8, 2, 5, 7, 3, 2, 7, 7, 1, 1, 5, 4, 9, 4, 2, 0, 8, 0, 4, 9, 9, 4, 5, 6, 4, 6, 4, 4, 8, 9, 5, 0, 1, 9, 4, 5, 4, 1, 1, 1, 3, 2, 7, 6, 5, 3, 8, 9, 7, 0, 4, 8, 5, 4, 9, 8, 9, 2, 0, 3, 5, 4, 5, 4, 6, 8, 7, 9, 9, 4, 8, 0, 0, 8, 6, 3, 9, 3, 9, 9, 5, 5, 5, 3, 1, 7, 1, 4, 6, 1, 4, 6, 7, 4, 5, 5, 8, 3, 3, 3, 4, 2, 3, 3, 8, 3, 4, 1, 1, 3, 6, 6, 1, 9, 5, 2, 2, 2, 7, 2, 5, 7, 5, 4, 7, 0, 1, 2, 5, 4, 1, 1, 7, 9, 6, 6, 9, 1, 6, 1, 5, 0, 2, 6, 0, 5, 4, 1, 8, 6, 3, 5, 1, 0, 9, 7, 4, 4, 3, 1, 1, 9, 5, 5, 4, 8, 0, 6, 8, 9, 6, 6, 5, 3, 9, 1, 9, 3, 9, 0, 6, 7, 3, 0, 2, 2, 0, 7, 2, 6, 4, 0, 4, 2, 0, 7, 5, 0, 1, 4, 2, 9, 4, 6, 1, 7, 2, 7, 3, 4, 6, 9, 0, 6, 7, 1, 3, 9, 2, 4, 8, 8, 0, 2, 5, 3, 2, 7, 3, 4, 1, 4, 5, 6, 0, 5, 5, 0, 2, 3, 3, 6, 3, 8, 0, 7, 5, 6, 2, 3, 5, 6, 9, 8, 5, 0, 0, 0, 0, 0, 9, 1, 4, 1, 2, 4, 4, 8, 5, 5, 1, 3, 0, 6, 4, 8, 2, 0, 2, 0, 7, 1, 0, 6, 8, 7, 3, 4, 2, 3, 7, 9, 8, 3, 6, 0, 1, 1, 6, 2, 6, 7, 6, 0, 0, 0, 6, 3, 2, 9, 4, 4, 4, 6, 2, 4, 2, 7, 5, 0, 6, 6, 6, 9, 6, 9, 5, 8, 1, 5, 7, 8, 8, 9, 1, 6, 1, 9, 1, 0, 4, 4, 9, 5, 9, 9, 5, 7, 4, 6, 4, 1, 7, 3, 2, 6, 5, 3, 4, 2, 0, 6, 9, 0, 1, 1, 5, 7, 7, 5, 8, 0, 5, 2, 2, 4, 0, 6, 1, 8, 2, 9, 2, 7, 9, 5, 5, 9, 7, 3, 2, 1, 3, 2, 2, 6, 0, 2, 3, 9, 1, 2, 1, 4, 7, 1, 4, 7, 2, 5, 7, 6, 4, 4, 1, 5, 1, 6, 5, 2, 7, 0, 7, 1, 1, 4, 9, 4, 1, 1, 2, 0, 0, 3, 9, 0, 1, 3, 4, 1, 6, 3, 1, 1, 5, 9, 2, 1, 2, 6, 2, 7, 4, 6, 4, 0, 4, 9, 4, 4, 0, 5, 8, 4, 8, 3, 6, 7, 1, 3, 3, 9, 0, 8, 7, 5, 2, 1, 2, 2, 7, 8, 1, 9, 7, 7, 6, 7, 7, 4, 6, 5, 9, 5, 5, 9, 1, 2, 2, 4, 1, 8, 3, 3, 8, 1, 9, 1, 6, 9, 8, 3, 8, 7, 5, 2, 6, 5, 8, 0, 5, 5, 5, 0, 9, 9, 5, 0, 5, 9, 9, 1, 4, 5, 9, 4, 8, 4, 3, 9, 9, 5, 8, 1, 1, 2, 5, 2, 7, 2, 8, 1, 7, 6, 0, 6, 2, 6, 7, 8, 1, 1, 9, 5, 0, 6, 6, 8, 8, 9, 3, 1, 8, 8, 6, 2, 4, 1, 4, 4, 5, 5, 3, 6, 0, 8, 7, 0, 6, 6, 0, 5, 7, 8, 1, 6, 7, 8, 6, 2, 7, 3, 5, 2, 9, 2, 9, 4, 7, 0, 8, 9, 6, 7, 1, 3, 3, 8, 4, 6, 6, 1, 1, 7, 5, 4, 7, 3, 3, 1, 0, 4, 8, 2, 6, 8, 2, 0, 9, 0, 6, 3, 8, 8, 3, 0, 9, 9, 0, 8, 4, 7, 8, 3, 3, 9, 8, 6, 5, 0, 0, 2, 0, 7, 9, 8, 1, 8, 8, 4, 1, 0, 0, 3, 9, 0, 5, 3, 0, 9, 2, 2, 2, 9, 2, 3, 5, 4, 0, 4, 1, 0, 1, 3, 7, 6, 2, 2, 8, 9, 4, 5, 1, 3, 6, 7, 4, 2, 8, 8, 5, 8, 3, 0, 1, 5, 5, 4, 4, 7, 1, 0, 1, 1, 1, 1, 4, 4, 4, 2, 0, 5, 7, 5, 7, 5, 2, 6, 7, 6, 0, 9, 3, 5, 0, 4, 4, 9, 1, 8, 1, 8, 3, 3, 1, 6, 6, 7, 3, 3, 8, 0, 7, 0, 7, 1, 3, 4, 1, 7, 8, 5, 1, 8, 3, 4, 4, 3, 8, 7, 0, 1, 5, 4, 5, 9, 8, 2, 7, 2, 6, 0, 7, 1, 6, 7, 2, 2, 4, 2, 4, 3, 3, 2, 0, 3, 0, 0, 8, 0, 8, 0, 6, 7, 8, 2, 1, 6, 0, 5, 1, 8, 3, 8, 5, 2, 2, 2, 4, 0, 9, 7, 6, 6, 4, 7, 7, 2, 2, 0, 5, 5, 4, 0, 6, 4, 2, 6, 7, 7, 2, 7, 2, 6, 0, 4, 6, 2, 6, 4, 5, 8, 0, 5, 2, 1, 0, 8, 3, 4, 3, 1, 3, 4, 5, 3, 2, 8, 5, 3, 0, 0, 3, 9, 3, 0, 6, 2, 1, 2, 5, 9, 8, 5, 1, 3, 9, 1, 9, 2, 0, 8, 8, 1, 7, 7, 8, 2, 9, 4, 0, 0, 3, 8, 2, 7, 9, 9, 9, 2, 7, 8, 4, 6, 7, 6, 8, 2, 6, 2, 8, 8, 1, 5, 2, 7, 3, 7, 6, 6, 6, 4, 8, 0, 0, 8, 7, 1, 9, 6, 3, 9, 0, 8, 4, 8, 2, 0, 0, 6, 4, 2, 0, 2, 7, 5, 3, 6, 4, 5, 5, 6, 0, 2, 0, 6, 2, 1, 9, 4, 4, 1, 9, 1, 2, 3, 0, 6, 9, 1, 3, 8, 4, 8, 0, 2, 7, 9, 5, 1, 5, 2, 4, 3, 9, 9, 9, 5, 8, 1, 7, 7, 1, 5, 6, 2, 4, 6, 6, 1, 2, 7, 7, 0, 1, 9, 6, 7, 2, 1, 4, 8, 1, 9, 0, 0, 0, 7, 3, 1, 4, 3, 8, 2, 1, 8, 8, 5, 3, 5, 3, 9, 5, 6, 8, 4, 4, 1, 9, 5, 1, 3, 3, 3, 6, 7, 7, 7, 9, 5, 5, 3, 7, 3, 1, 5, 2, 0, 2, 3, 3, 0, 3, 8, 9, 6, 5, 5, 9, 5, 1, 7, 1, 7, 9, 8, 0, 0, 5, 4, 9, 2, 2, 3, 2, 0, 9, 0, 4, 3, 6, 2, 2, 4, 4, 9, 1, 8, 9, 5, 7, 2, 7, 0, 2, 9, 6, 8, 4, 8, 0, 4, 0, 1, 2, 9, 7, 2, 2, 7, 3, 9, 6, 9, 8, 0, 1, 1, 2, 5, 0, 9, 3, 1, 7, 1, 5, 6, 7, 8, 8, 1, 1, 5, 2, 3, 3, 9, 9, 5, 7, 2, 8, 4, 5, 2, 3, 2, 0, 2, 6, 8, 3, 3, 9, 6, 0, 8, 4, 2, 6, 0, 3, 3, 1, 2, 3, 5, 0, 9, 1, 9, 1, 6, 2, 3, 3, 9, 2, 0, 3, 7, 4, 3, 6, 4, 5, 1, 1, 6, 3, 5, 4, 9, 2, 2, 2, 3, 2, 4, 3, 0, 4, 4, 4, 5, 9, 1, 1, 8, 7, 5, 6, 3, 4, 7, 1, 3, 8, 0, 7, 9, 1, 5, 6, 3, 6, 7, 1, 8, 7, 4, 1, 8, 0, 4, 1, 8, 0, 7, 7, 2, 0, 6, 8, 7, 2, 2, 1, 3, 1, 6, 4, 7, 9, 0, 9, 1, 8, 8, 6, 1, 9, 4, 2, 5, 8, 4, 2, 5, 6, 1, 3, 2, 3, 3, 6, 4, 1, 4, 1, 5, 5, 8, 4, 8, 1, 7, 2, 0, 9, 6, 3, 2, 3, 6, 4, 1, 6, 2, 2, 5, 3, 5, 1, 3, 4, 2, 3, 6, 9, 1, 2, 0, 7, 1, 7, 5, 3, 6, 1, 4, 3, 3, 9, 8, 7, 2, 7, 4, 4, 2, 2, 8, 6, 7, 5, 8, 2, 1, 6, 4, 4, 6, 6, 2, 1, 6, 2, 3, 2, 8, 0, 4, 9, 3, 4, 7, 3, 1, 2, 7, 7, 8, 8, 7, 9, 6, 2, 3, 3, 9, 1, 6, 8, 8, 6, 6, 6, 2, 6, 4, 9, 7, 6, 9, 8, 6, 8, 0, 0, 4, 5, 5, 5, 4, 3, 4, 3, 1, 7, 0, 4, 9, 2, 2, 9, 1, 5, 0, 8, 0, 4, 9, 4, 0, 8, 9, 0, 7, 4, 7, 2, 5, 1, 9, 9, 6, 9, 9, 8, 8, 1, 9, 7, 0, 1, 4, 9, 0, 1, 0, 2, 5, 0, 3, 0, 8, 5, 5, 4, 6, 8, 2, 3, 4, 2, 8, 2, 0, 0, 3, 9, 0, 8, 7, 5, 8, 3, 3, 3, 1, 5, 8, 5, 2, 4, 4, 2, 1, 0, 4, 0, 6, 3, 2, 3, 2, 7, 4, 8, 8, 6, 3, 5, 3, 5, 0, 8, 0, 1, 9, 4, 7, 2, 4, 0, 0, 8, 7, 1, 3, 9, 8, 4, 4, 1, 2, 4, 6, 2, 4, 1, 4, 0, 6, 8, 8, 2, 9, 2, 6, 7, 6, 5, 4, 9, 0, 6, 9, 1, 9, 0, 1, 9, 7, 8, 5, 7, 9, 4, 5, 1, 1, 4, 0, 0, 1, 1, 5, 0, 8, 9, 8, 2, 5, 0, 8, 7, 0, 0, 4, 4, 3, 9, 7, 1, 6, 5, 3, 1, 4, 2, 0, 2, 5, 9, 4, 6, 3, 9, 4, 2, 5, 6, 5, 7, 4, 8, 4, 4, 6, 1, 3, 0, 8, 3, 3, 8, 0, 3, 6, 9, 2, 6, 1, 7, 4, 0, 1, 1, 6, 7, 8, 8, 6, 4, 2, 8, 8, 3, 7, 3, 6, 8, 5, 1, 5, 0, 9, 1, 9, 1, 9, 9, 6, 5, 6, 1, 7, 0, 0, 6, 1, 2, 0, 6, 9, 9, 7, 2, 9, 3, 5, 2, 9, 4, 7, 9, 7, 6, 2, 3, 4, 8, 9, 8, 9, 1, 4, 4, 2, 9, 4, 5, 7, 4, 8, 0, 8, 2, 5, 2, 1, 1, 2, 1, 5, 7, 9, 3, 9, 6, 2, 3, 9, 3, 6, 5, 4, 4, 4, 6, 2, 8, 7, 0, 1, 2, 6, 5, 8, 5, 0, 6, 0, 8, 3, 7, 3, 3, 0, 2, 8, 9, 4, 5, 3, 9, 1, 4, 4, 4, 7, 6, 1, 9, 9, 8, 1, 1, 0, 9, 0, 3, 4, 0, 9, 9, 2, 7, 9, 4, 3, 8, 5, 5, 4, 9, 0, 1, 5, 8, 1, 2, 7, 1, 1, 8, 2, 7, 6, 1, 9, 1, 1, 8, 1, 5, 1, 8, 5, 2, 9, 6, 3, 1, 9, 0, 6, 0, 2, 6, 7, 1, 9, 3, 8, 5, 3, 5, 0, 7, 0, 5, 5, 0, 2, 8, 9, 1, 3, 9, 2, 6, 0, 6, 9, 3, 3, 9, 4, 5, 6, 0, 0, 4, 5, 6, 5, 1, 8, 5, 3, 7, 0, 1, 1, 0, 8, 7, 3, 4, 1, 8, 9, 1, 3, 5, 2, 5, 8, 3, 9, 7, 5, 5, 3, 5, 6, 6, 2, 4, 0, 5, 5, 3, 6, 0, 3, 4, 8, 4, 8, 3, 3, 7, 3, 1, 8, 4, 2, 2, 0, 1, 7, 2, 1, 4, 3, 2, 3, 5, 6, 9, 1, 5, 9, 1, 4, 6, 4, 0, 6, 3, 8, 6, 8, 5, 1, 3, 7, 0, 5, 3, 1, 4, 2, 2, 3, 2, 8, 0, 6, 1, 2, 8, 0, 2, 9, 1, 3, 2, 6, 7, 8, 7, 6, 8, 6, 1, 7, 6, 2, 0, 1, 0, 5, 6, 6, 8, 6, 4, 3, 6, 2, 5, 4, 3, 4, 5, 0, 8, 6, 9, 0, 9, 2, 9, 6, 6, 5, 7, 2, 4, 3, 9, 6, 4, 7, 3, 8, 6, 2, 0, 9, 2, 9, 7, 0, 6, 3, 2, 6, 9, 2, 1, 8, 2, 4, 4, 8, 1, 0, 5, 5, 6, 2, 1, 6, 1, 8, 5, 1, 3, 2, 8, 6, 0, 5, 8, 6, 5, 4, 2, 0, 6, 8, 7, 6, 5, 7, 0, 3, 1, 1, 5, 0, 6, 0, 8, 1, 6, 7, 4, 8, 4, 1, 6, 9, 8, 7, 4, 1, 7, 8, 2, 2, 7, 8, 1, 6, 9, 7, 7, 2, 3, 3, 1, 0, 1, 5, 1, 1, 5, 2, 1, 9, 8, 8, 1, 1, 5, 3, 9, 1, 5, 2, 9, 4, 9, 1, 9, 1, 7, 5, 8, 3, 0, 8, 8, 9, 8, 5, 1, 7, 9, 3, 2, 9, 2, 8, 4, 0, 8, 6, 4, 0, 9, 0, 6, 7, 9, 0, 3, 6, 8, 1, 7, 7, 9, 1, 1, 6, 1, 1, 6, 3, 5, 3, 9, 5, 0, 1, 2, 8, 4, 1, 8, 7, 9, 9, 3, 5, 7, 4, 4, 5, 2, 8, 8, 2, 4, 6, 5, 2, 2, 2, 9, 0, 4, 6, 2, 2, 6, 5, 2, 2, 8, 8, 8, 7, 7, 9, 0, 9, 1, 8, 8, 9, 5, 2, 0, 2, 7, 0, 8, 3, 4, 1, 0, 4, 7, 7, 1, 4, 1, 7, 3, 5, 1, 7, 1, 1, 8, 9, 1, 8, 2, 5, 0, 7, 7, 9, 7, 6, 2, 0, 7, 2, 6, 5, 6, 4, 3, 3, 1, 4, 8, 9, 3, 5, 4, 3, 5, 6, 1, 6, 0, 5, 1, 2, 0, 0, 1, 3, 9, 0, 7, 7, 2, 4, 2, 5, 1, 8, 7, 9, 5, 6, 5, 8, 6, 4, 0, 9, 1, 0, 6, 2, 2, 0, 0, 7, 4, 6, 2, 3, 7, 1, 7, 8, 3, 6, 5, 3, 9, 4, 5, 3, 9, 9, 0, 7, 2, 9, 9, 3, 2, 8, 8, 9, 6, 7, 2, 3, 4, 4, 4, 9, 6, 5, 8, 8, 9, 7, 1, 1, 7, 0, 2, 9, 6, 2, 8, 0, 5, 6, 5, 7, 3, 5, 2, 4, 6, 4, 6, 3, 0, 8, 9, 6, 0, 7, 0, 1, 1, 8, 7, 4, 9, 0, 8, 1, 1, 0, 8, 8, 5, 0, 5, 5, 0, 5, 0, 8, 1, 8, 2, 9, 1, 6, 3, 2, 4, 0, 1, 2, 4, 1, 1, 4, 4, 6, 2, 2, 5, 7, 0, 6, 6, 1, 8, 2, 4, 8, 8, 4, 2, 6, 8, 9, 8, 6, 5, 4, 8, 8, 7, 1, 6, 2, 5, 6, 4, 4, 5, 6, 3, 7, 4, 3, 8, 4, 2, 1, 6, 2, 9, 6, 1, 1, 8, 1, 8, 4, 8, 8, 7, 8, 7, 6, 3, 9, 7, 7, 4, 9, 9, 5, 2, 1, 4, 4, 1, 4, 8, 7, 4, 1, 6, 4, 8, 7, 6, 2, 0, 8, 6, 9, 7, 1, 3, 2, 0, 1, 6, 5, 5, 4, 1, 4, 6, 8, 6, 3, 7, 9, 1, 8, 9, 8, 1, 6, 5, 2, 1, 7, 5, 8, 4, 9, 1, 5, 9, 6, 6, 4, 2, 8, 9, 4, 8, 1, 6, 2, 1, 1, 6, 1, 2, 1, 5, 1, 6, 8, 3, 9, 7, 3, 0, 3, 1, 2, 8, 7, 8, 1, 0, 2, 4, 7, 3, 6, 7, 6, 3, 6, 2, 7, 4, 9, 9, 3, 6, 8, 9, 4, 0, 9, 1, 6, 6, 4, 8, 6, 2, 0, 3, 4, 2, 7, 3, 1, 9, 9, 4, 2, 3, 8, 4, 9, 6, 8, 5, 2, 1, 1, 9, 1, 9, 2, 4, 1, 8, 6, 7, 7, 4, 0, 4, 5, 5, 4, 5, 3, 2, 1, 3, 5, 3, 7, 0, 3, 0, 7, 4, 6, 3, 1, 7, 3, 4, 6, 1, 1, 4, 1, 3, 4, 3, 5, 8, 2, 6, 5, 6, 9, 2, 6, 1, 6, 6, 4, 1, 0, 5, 9, 0, 7, 6, 1, 8, 6, 7, 1, 3, 9, 3, 1, 3, 9, 7, 4, 2, 7, 5, 1, 0, 5, 7, 5, 8, 5, 8, 8, 0, 0, 5, 3, 0, 3, 0, 4, 6, 8, 0, 2, 9, 8, 3, 9, 7, 6, 1, 6, 8, 2, 4, 8, 6, 1, 0, 3, 2, 9, 2, 4, 0, 3, 3, 3, 6, 3, 4, 2, 5, 0, 9, 9, 2, 0, 6, 4, 9, 8, 9, 8, 7, 3, 0, 1, 6, 5, 2, 6, 2, 6, 7, 8, 5, 5, 3, 3, 7, 0, 8, 9, 3, 3, 2, 4, 1, 0, 7, 1, 4, 4, 4, 0, 2, 6, 7, 8, 5, 2, 9, 7, 6, 9, 4, 8, 8, 3, 9, 7, 6, 2, 3, 9, 5, 5, 8, 6, 1, 6, 2, 0, 9, 5, 8, 2, 6, 8, 5, 9, 2, 8, 7, 5, 5, 9, 4, 6, 7, 8, 5, 8, 3, 4, 4, 3, 0, 2, 8, 9, 4, 1, 2, 4, 2, 7, 1, 3, 8, 4, 3, 7, 5, 4, 2, 7, 1, 8, 5, 8, 0, 9, 2, 4, 5, 5, 3, 3, 9, 8, 1, 3, 8, 7, 0, 8, 7, 0, 1, 0, 2, 6, 8, 8, 6, 6, 1, 3, 7, 5, 0, 1, 7, 6, 5, 9, 4, 5, 2, 9, 9, 2, 6, 9, 1, 7, 9, 7, 5, 4, 4, 0, 9, 4, 2, 8, 2, 9, 8, 2, 9, 3, 2, 3, 6, 4, 6, 0, 7, 0, 7, 4, 7, 4, 6, 1, 7, 0, 8, 2, 4, 0, 3, 0, 8, 2, 0, 3, 0, 3, 3, 7, 4, 7, 8, 6, 4, 7, 8, 3, 6, 2, 9, 7, 5, 6, 4, 5, 6, 0, 7, 1, 2, 4, 4, 3, 8, 0, 1, 0, 0, 1, 2, 6, 8, 0, 4, 9, 4, 4, 4, 8, 8, 8, 3, 0, 1, 7, 9, 8, 0, 8, 5, 4, 0, 7, 6, 1, 7, 8, 4, 2, 0, 7, 0, 2, 1, 4, 1, 6, 3, 3, 3, 1, 9, 5, 1, 3, 1, 5, 7, 0, 0, 6, 3, 8, 9, 9, 1, 2, 6, 7, 6, 6, 5, 9, 9, 8, 9, 3, 4, 8, 6, 4, 5, 0, 1, 1, 2, 2, 0, 5, 7, 0, 2, 7, 3, 6, 8, 7, 6, 2, 6, 0, 1, 8, 3, 3, 4, 1, 4, 1, 2, 2, 3, 7, 3, 2, 0, 5, 5, 9, 2, 9, 6, 0, 5, 5, 6, 8, 2, 3, 0, 6, 8, 8, 3, 6, 7, 0, 0, 5, 1, 4, 9, 0, 0, 4, 3, 4, 4, 8, 7, 8, 2, 9, 7, 0, 2, 8, 0, 1, 1, 4, 5, 2, 2, 3, 7, 3, 2, 3, 8, 4, 7, 8, 7, 9, 9, 0, 6, 9, 1, 2, 1, 9, 9, 6, 7, 5, 9, 7, 9, 8, 2, 5, 4, 5, 0, 3, 3, 6, 7, 0, 4, 7, 8, 1, 2, 7, 9, 0, 2, 8, 5, 3, 8, 2, 9, 2, 1, 3, 6, 6, 4, 2, 0, 3, 2, 6, 8, 1, 0, 1, 5, 5, 8, 6, 8, 1, 0, 9, 8, 8, 8, 4, 5, 8, 2, 5, 3, 0, 0, 4, 2, 2, 4, 8, 2, 2, 8, 5, 5, 4, 8, 1, 6, 6, 5, 1, 9, 1, 5, 3, 0, 0, 8, 0, 0, 1, 1, 9, 4, 1, 3, 4, 3, 1, 8, 6, 8, 2, 7, 8, 2, 7, 0, 0, 4, 1, 2, 3, 1, 4, 8, 5, 3, 6, 7, 5, 5, 2, 5, 0, 3, 8, 4, 8, 0, 3, 2, 2, 0, 8, 9, 6, 2, 6, 3, 8, 1, 0, 9, 2, 1, 2, 4, 0, 1, 4, 1, 3, 9, 3, 0, 1, 5, 1, 9, 8, 7, 9, 5, 2, 9, 5, 4, 2, 1, 6, 0, 1, 1, 7, 0, 4, 6, 8, 4, 8, 6, 6, 8, 8, 9, 7, 0, 7, 6, 9, 5, 9, 0, 6, 3, 4, 6, 0, 3, 4, 9, 8, 2, 9, 6, 2, 4, 0, 2, 9, 7, 6, 6, 1, 5, 5, 4, 6, 4, 0, 4, 8, 9, 5, 7, 4, 4, 8, 8, 9, 1, 0, 7, 8, 2, 0, 9, 2, 0, 9, 6, 3, 0, 6, 6, 3, 0, 3, 9, 5, 2, 1, 3, 0, 9, 9, 9, 6, 5, 2, 2, 1, 1, 1, 8, 6, 6, 3, 6, 9, 4, 9, 6, 9, 8, 8, 5, 7, 0, 9, 2, 8, 2, 1, 4, 9, 0, 2, 0, 0, 8, 0, 1, 8, 1, 3, 4, 6, 5, 9, 9, 4, 0, 3, 0, 4, 9, 4, 0, 1, 6, 1, 2, 2, 4, 7, 5, 0, 6, 6, 9, 7, 5, 5, 3, 2, 2, 1, 1, 2, 9, 2, 9, 0, 7, 2, 9, 3, 9, 3, 1, 7, 5, 3, 3, 7, 4, 6, 6, 6, 9, 0, 5, 8, 7, 8, 5, 2, 6, 3, 2, 2, 8, 6, 0, 1, 0, 6, 8, 7, 9, 5, 4, 9, 6, 5, 8, 1, 7, 0, 5, 3, 4, 7, 5, 3, 7, 0, 9, 8, 3, 1, 2, 3, 9, 5, 7, 3, 4, 1, 5, 6, 0, 5, 6, 4, 1, 7, 7, 4, 0, 0, 1, 8, 5, 8, 6, 6, 0, 3, 9, 7, 6, 2, 7, 0, 5, 3, 0, 4, 7, 8, 8, 6, 2, 2, 2, 7, 2, 3, 6, 8, 5, 5, 8, 4, 6, 1, 7, 1, 8, 0, 4, 5, 8, 4, 8, 8, 0, 2, 1, 4, 6, 9, 9, 6, 4, 0, 4, 8, 4, 9, 2, 4, 7, 1, 3, 1, 6, 2, 7, 7, 4, 8, 9, 7, 8, 5, 6, 0, 3, 7, 4, 3, 4, 3, 5, 4, 0, 0, 9, 1, 4, 0, 6, 6, 9, 4, 9, 1, 8, 0, 6, 3, 9, 6, 1, 4, 9, 1, 5, 7, 4, 7, 4, 2, 9, 7, 8, 5, 9, 2, 1, 6, 3, 0, 8, 8, 6, 5, 5, 1, 5, 3, 8, 6, 7, 5, 2, 6, 0, 3, 6, 2, 9, 1, 4, 4, 2, 8, 8, 3, 7, 6, 5, 9, 4, 6, 4, 5, 1, 7, 1, 2, 7, 4, 3, 4, 7, 0, 9, 4, 3, 3, 9, 0, 6, 9, 6, 3, 1, 3, 2, 2, 8, 7, 7, 8, 5, 9, 3, 8, 5, 4, 0, 7, 9, 4, 7, 1, 2, 6, 0, 1, 5, 5, 9, 4, 3, 5, 8, 8, 5, 0, 0, 0, 0, 9, 0, 2, 4, 6, 2, 9, 2, 4, 5, 9, 1, 3, 1, 5, 0, 3, 3, 1, 5, 2, 9, 7, 3, 8, 2, 1, 0, 3, 3, 4, 7, 4, 4, 9, 3, 5, 4, 6, 2, 0, 1, 7, 8, 0, 5, 3, 0, 3, 7, 5, 7, 1, 9, 0, 5, 5, 8, 0, 0, 9, 1, 9, 0, 6, 4, 9, 3, 8, 5, 3, 4, 5, 6, 0, 0, 1, 7, 4, 9, 2, 5, 0, 3, 8, 1, 3, 6, 3, 1, 8, 3, 9, 8, 5, 3, 4, 6, 8, 1, 9, 1, 5, 0, 7, 6, 5, 6, 6, 6, 8, 4, 8, 4, 1, 7, 8, 0, 2, 3, 2, 2, 1, 7, 5, 7, 8, 0, 6, 3, 1, 6, 3, 7, 8, 5, 0, 0, 9, 5, 3, 8, 5, 1, 3, 1, 8, 7, 3, 8, 7, 2, 5, 6, 2, 0, 1, 6, 0, 0, 5, 6, 9, 8, 4, 5, 4, 7, 2, 7, 6, 7, 2, 2, 8, 9, 4, 1, 1, 1, 5, 9, 6, 0, 4, 5, 4, 7, 3, 5, 0, 2, 4, 3, 9, 9, 0, 7, 3, 0, 2, 1, 6, 9, 0, 5, 7, 6, 4, 7, 1, 2, 7, 5, 1, 4, 5, 7, 9, 7, 0, 4, 3, 8, 1, 2, 1, 1, 7, 4, 6, 2, 5, 9, 5, 9, 0, 2, 2, 0, 5, 7, 2, 2, 2, 1, 5, 0, 4, 9, 3, 7, 9, 2, 9, 8, 4, 8, 7, 5, 6, 1, 3, 8, 9, 4, 7, 2, 6, 1, 9, 3, 2, 6, 2, 2, 9, 0, 8, 8, 9, 1, 7, 2, 3, 1, 2, 7, 3, 9, 7, 1, 4, 2, 0, 3, 1, 3, 0, 1, 1, 2, 4, 2, 7, 0, 2, 8, 3, 5, 5, 4, 5, 1, 4, 7, 6, 5, 2, 2, 6, 7, 2, 4, 2, 7, 4, 2, 4, 1, 9, 8, 5, 1, 8, 7, 3, 6, 0, 8, 8, 1, 2, 2, 8, 1, 2, 4, 8, 1, 4, 7, 5, 0, 9, 3, 1, 1, 0, 7, 5, 7, 5, 1, 1, 1, 5, 9, 1, 0, 9, 2, 2, 7, 6, 1, 2, 4, 8, 6, 8, 7, 4, 3, 3, 2, 6, 0, 5, 6, 5, 4, 5, 6, 2, 6, 2, 6, 5, 3, 2, 3, 3, 6, 0, 7, 0, 8, 7, 3, 4, 9, 3, 4, 5, 5, 7, 7, 3, 0, 6, 7, 4, 8, 6, 8, 4, 9, 8, 1, 7, 5, 5, 2, 8, 8, 0, 4, 7, 8, 5, 1, 5, 8, 5, 6, 2, 7, 5, 7, 6, 6, 4, 0, 8, 8, 8, 6, 7, 4, 0, 7, 8, 4, 5, 9, 9, 0, 2, 8, 1, 3, 3, 1, 6, 7, 0, 0, 4, 5, 8, 8, 7, 7, 3, 0, 4, 6, 1, 8, 3, 1, 7, 6, 4, 9, 9, 9, 5, 6, 0, 1, 7, 0, 3, 8, 1, 7, 0, 7, 4, 8, 7, 5, 8, 8, 2, 4, 4, 8, 0, 4, 8, 6, 8, 4, 4, 5, 2, 9, 7, 4, 7, 4, 2, 3, 6, 0, 6, 5, 1, 7, 6, 9, 7, 0, 9, 2, 4, 4, 8, 0, 2, 0, 2, 6, 8, 5, 2, 8, 3, 4, 7, 8, 4, 3, 9, 3, 1, 4, 6, 5, 3, 2, 9, 0, 3, 1, 3, 2, 3, 6, 4, 6, 1, 3, 4, 6, 6, 4, 1, 0, 4, 6, 7, 5, 9, 5, 7, 6, 5, 5, 2, 0, 5, 2, 0, 0, 8, 6, 6, 5, 4, 1, 3, 3, 4, 3, 9, 9, 3, 1, 7, 6, 0, 4, 1, 5, 6, 9, 9, 4, 5, 1, 9, 6, 4, 3, 0, 3, 3, 6, 1, 2, 9, 2, 3, 7, 1, 6, 1, 0, 1, 5, 0, 2, 6, 3, 6, 4, 3, 1, 4, 9, 0, 9, 9, 3, 4, 0, 0, 8, 4, 3, 0, 9, 7, 1, 0, 5, 7, 1, 3, 3, 5, 0, 2, 1, 2, 7, 7, 5, 6, 7, 9, 0, 5, 2, 6, 9, 0, 2, 0, 7, 3, 1, 8, 1, 2, 1, 4, 1, 8, 4, 6, 1, 3, 5, 9, 7, 0, 3, 4, 7, 1, 2, 9, 5, 9, 6, 9, 0, 7, 7, 7, 4, 8, 5, 8, 1, 0, 9, 1, 3, 4, 9, 0, 7, 9, 9, 9, 3, 1, 0, 8, 5, 5, 7, 2, 5, 0, 4, 6, 1, 3, 6, 8, 0, 3, 0, 5, 0, 1, 3, 1, 2, 9, 2, 2, 8, 4, 7, 6, 6, 2, 7, 5, 2, 9, 2, 0, 5, 5, 8, 0, 6, 4, 3, 8, 1, 4, 8, 9, 9, 0, 8, 8, 1, 7, 3, 3, 1, 8, 6, 4, 8, 1, 8, 2, 4, 8, 5, 1, 7, 3, 0, 3, 6, 5, 1, 1, 4, 7, 8, 6, 6, 6, 6, 9, 1, 0, 1, 2, 4, 4, 0, 2, 6, 8, 3, 2, 2, 1, 7, 8, 6, 9, 7, 6, 4, 0, 1, 7, 7, 0, 2, 9, 1, 0, 9, 5, 7, 7, 7, 8, 5, 1, 8, 4, 4, 0, 2, 1, 0, 0, 4, 7, 7, 3, 2, 3, 1, 7, 4, 8, 5, 0, 0, 0, 3, 2, 2, 3, 1, 6, 0, 1, 0, 4, 6, 2, 2, 5, 9, 0, 8, 9, 9, 9, 8, 3, 6, 2, 8, 4, 7, 8, 7, 5, 8, 1, 6, 6, 9, 7, 8, 7, 3, 0, 4, 6, 8, 3, 6, 7, 6, 2, 3, 0, 0, 9, 3, 2, 6, 4, 7, 2, 9, 7, 4, 5, 2, 9, 0, 2, 7, 2, 7, 1, 6, 4, 6, 4, 9, 1, 6, 5, 9, 0, 4, 8, 8, 1, 1, 1, 3, 8, 7, 5, 4, 5, 5, 1, 7, 8, 8, 7, 9, 0, 0, 9, 2, 8, 0, 8, 7, 7, 9, 3, 8, 6, 1, 0, 3, 3, 0, 4, 3, 2, 4, 3, 6, 7, 3, 2, 2, 9, 8, 5, 6, 6, 9, 0, 9, 0, 9, 8, 0, 7, 2, 3, 4, 6, 6, 8, 3, 1, 5, 6, 1, 0, 4, 7, 8, 0, 6, 9, 0, 4, 0, 5, 6, 6, 7, 5, 3, 5, 7, 1, 2, 2, 7, 3, 9, 1, 8, 5, 2, 6, 8, 2, 0, 3, 3, 2, 3, 2, 5, 7, 0, 8, 7, 0, 0, 7, 4, 4, 9, 7, 5, 9, 9, 2, 4, 2, 4, 4, 5, 1, 6, 9, 4, 3, 6, 6, 0, 6, 0, 9, 6, 1, 4, 9, 6, 1, 9, 5, 3, 8, 4, 8, 2, 3, 4, 3, 5, 1, 3, 4, 1, 1, 4, 9, 0, 7, 8, 5, 9, 9, 8, 6, 6, 0, 0, 9, 7, 2, 1, 4, 2, 3, 8, 3, 0, 4, 6, 3, 6, 5, 3, 3, 9, 4, 0, 0, 6, 8, 2, 0, 9, 6, 1, 8, 4, 1, 0, 0, 7, 3, 7, 8, 1, 2, 6, 1, 9, 1, 2, 9, 7, 8, 1, 0, 9, 7, 9, 1, 6, 0, 8, 1, 3, 8, 6, 4, 2, 2, 8, 7, 1, 5, 8, 4, 6, 8, 7, 4, 8, 0, 8, 6, 1, 4, 7, 7, 8, 7, 0, 5, 2, 4, 9, 3, 7, 2, 7, 3, 5, 5, 1, 1, 2, 2, 6, 3, 2, 3, 2, 9, 1, 7, 8, 9, 3, 6, 5, 9, 5, 7, 3, 3, 4, 3, 8, 3, 1, 5, 7, 2, 4, 0, 1, 6, 4, 5, 6, 9, 9, 1, 4, 7, 2, 2, 9, 5, 9, 6, 6, 0, 2, 6, 2, 6, 7, 6, 2, 3, 4, 5, 8, 1, 3, 7, 5, 8, 9, 8, 4, 5, 8, 1, 2, 2, 8, 8, 4, 5, 9, 3, 7, 8, 2, 1, 9, 0, 9, 8, 3, 7, 7, 2, 1, 9, 0, 3, 1, 8, 6, 5, 4, 6, 8, 0, 2, 5, 1, 5, 3, 4, 9, 6, 4, 9, 4, 4, 4, 9, 9, 6, 4, 9, 7, 0, 3, 7, 6, 3, 4, 8, 5, 7, 9, 3, 2, 8, 8, 8, 3, 6, 3, 2, 0, 8, 5, 6, 2, 4, 4, 8, 2, 2, 6, 5, 0, 8, 9, 2, 1, 5, 6, 4, 6, 2, 6, 7, 2, 7, 2, 8, 5, 2, 7, 0, 3, 3, 1, 5, 1, 4, 9, 2, 9, 0, 2, 3, 7, 9, 9, 6, 3, 2, 2, 0, 1, 4, 7, 5, 8, 7, 6, 5, 6, 6, 7, 4, 4, 2, 7, 6, 7, 2, 7, 0, 4, 9, 0, 2, 0, 9, 6, 2, 6, 1, 0, 0, 9, 5, 9, 1, 7, 8, 1, 8, 7, 8, 2, 3, 9, 6, 6, 1, 1, 0, 6, 5, 4, 1, 9, 8, 1, 2, 4, 2, 8, 1, 5, 9, 1, 3, 2, 6, 4, 4, 5, 8, 0, 1, 7, 7, 3, 3, 7, 1, 1, 7, 6, 8, 0, 7, 9, 7, 4, 8, 9, 3, 5, 3, 5, 9, 8, 1, 3, 3, 6, 7, 4, 1, 9, 4, 7, 4, 2, 5, 5, 4, 0, 8, 9, 8, 6, 8, 0, 2, 4, 1, 7, 2, 0, 5, 5, 5, 0, 6, 1, 5, 9, 6, 4, 1, 9, 7, 2, 9, 2, 6, 1, 8, 4, 1, 8, 3, 7, 2, 2, 2, 3, 5, 2, 9, 7, 3, 1, 5, 3, 1, 7, 2, 1, 5, 4, 3, 6, 3, 9, 2, 2, 5, 0, 8, 8, 7, 5, 0, 3, 2, 1, 6, 4, 1, 5, 5, 5, 1, 4, 5, 1, 2, 2, 6, 2, 3, 8, 8, 2, 7, 6, 5, 6, 7, 2, 6, 6, 3, 6, 4, 2, 2, 9, 0, 8, 5, 2, 9, 8, 3, 1, 9, 4, 5, 1, 4, 2, 6, 1, 6, 9, 1, 6, 0, 0, 9, 9, 1, 3, 7, 2, 0, 6, 9, 8, 0, 1, 2, 0, 3, 4, 3, 7, 3, 7, 0, 5, 9, 4, 2, 7, 0, 6, 0, 6, 6, 2, 9, 9, 0, 1, 4, 0, 7, 7, 1, 5, 5, 4, 7, 6, 0, 1, 1, 7, 9, 6, 3, 2, 5, 5, 6, 5, 3, 3, 1, 5, 2, 0, 1, 1, 1, 2, 1, 1, 9, 3, 8, 4, 6, 0, 9, 6, 7, 3, 8, 3, 7, 0, 5, 5, 0, 2, 9, 4, 0, 2, 4, 1, 2, 5, 1, 3, 0, 5, 2, 9, 9, 0, 1, 2, 9, 3, 0, 0, 5, 3, 6, 4, 1, 4, 9, 5, 0, 7, 0, 1, 7, 9, 3, 9, 5, 3, 8, 3, 3, 8, 5, 0, 8, 6, 7, 5, 5, 9, 4, 8, 4, 3, 4, 7, 7, 4, 1, 6, 2, 7, 1, 0, 3, 9, 1, 9, 9, 5, 8, 7, 9, 0, 3, 7, 0, 1, 9, 1, 2, 4, 1, 5, 4, 9, 9, 2, 1, 5, 8, 0, 7, 6, 0, 3, 2, 7, 6, 6, 8, 0, 4, 6, 8, 0, 0, 5, 7, 5, 1, 1, 9, 1, 1, 8, 1, 8, 3, 5, 1, 6, 5, 5, 6, 4, 0, 8, 4, 4, 5, 2, 3, 5, 9, 0, 0, 2, 9, 0, 2, 2, 1, 7, 6, 9, 8, 6, 4, 7, 3, 0, 4, 2, 6, 4, 8, 0, 8, 2, 5, 5, 1, 7, 9, 6, 1, 0, 0, 8, 4, 3, 2, 5, 6, 4, 5, 3, 1, 2, 5, 4, 2, 1, 2, 3, 0, 6, 9, 1, 4, 8, 6, 5, 5, 8, 6, 2, 6, 2, 1, 3, 7, 1, 6, 4, 8, 0, 0, 4, 3, 1, 8, 8, 8, 0, 0, 9, 5, 9, 5, 5, 8, 3, 7, 7, 1, 4, 9, 7, 5, 6, 6, 8, 6, 1, 7, 8, 7, 6, 1, 1, 3, 3, 8, 1, 7, 5, 8, 0, 4, 8, 6, 2, 4, 2, 5, 4, 6, 1, 9, 4, 8, 6, 0, 7, 8, 6, 0, 4, 3, 5, 5, 7, 8, 1, 7, 2, 5, 3, 1, 2, 2, 1, 3, 0, 2, 6, 5, 8, 2, 2, 6, 1, 0, 2, 6, 5, 7, 4, 1, 2, 2, 2, 5, 1, 6, 8, 5, 0, 0, 0, 3, 9, 0, 2, 7, 2, 6, 1, 0, 6, 2, 9, 8, 6, 9, 9, 7, 0, 4, 2, 2, 6, 6, 1, 9, 4, 7, 7, 9, 9, 1, 5, 5, 1, 6, 5, 9, 8, 4, 7, 0, 3, 0, 0, 0, 3, 9, 1, 9, 3, 4, 5, 3, 8, 0, 1, 2, 8, 3, 0, 5, 8, 1, 8, 7, 5, 1, 6, 6, 7, 2, 4, 5, 4, 3, 3, 0, 3, 8, 3, 4, 0, 8, 0, 0, 1, 7, 5, 1, 6, 3, 6, 7, 2, 0, 2, 9, 4, 2, 2, 8, 6, 5, 5, 3, 1, 9, 2, 7, 7, 3, 3, 0, 6, 1, 8, 1, 8, 7, 7, 0, 7, 0, 8, 6, 0, 6, 5, 5, 7, 1, 6, 6, 9, 6, 0, 5, 7, 6, 5, 1, 4, 2, 6, 5, 1, 0, 4, 3, 4, 1, 1, 5, 2, 5, 7, 5, 6, 5, 3, 7, 2, 2, 0, 6, 1, 3, 7, 5, 8, 4, 0, 6, 8, 5, 0, 2, 5, 0, 6, 7, 0, 8, 1, 7, 9, 3, 2, 3, 5, 0, 2, 4, 1, 2, 5, 3, 2, 2, 5, 5, 4, 7, 4, 6, 0, 6, 9, 8, 1, 6, 7, 9, 3, 2, 3, 0, 0, 5, 3, 4, 8, 6, 6, 4, 8, 1, 5, 1, 2, 3, 4, 7, 4, 2, 8, 8, 9, 1, 9, 6, 0, 9, 2, 9, 9, 1, 6, 3, 9, 2, 8, 2, 1, 2, 7, 6, 8, 9, 1, 8, 9, 7, 5, 0, 3, 3, 3, 8, 4, 2, 3, 2, 1, 0, 7, 0, 6, 8, 8, 5, 6, 0, 6, 1, 6, 3, 6, 7, 6, 2, 7, 2, 1, 4, 6, 3, 5, 8, 8, 6, 1, 6, 6, 1, 8, 2, 5, 7, 3, 5, 3, 2, 1, 9, 2, 7, 4, 2, 3, 3, 1, 9, 6, 2, 6, 5, 6, 4, 5, 1, 0, 9, 0, 2, 7, 7, 8, 9, 7, 2, 2, 3, 6, 1, 3, 3, 9, 8, 6, 2, 6, 0, 6, 2, 2, 9, 9, 6, 1, 8, 7, 7, 7, 7, 1, 6, 6, 7, 1, 8, 9, 8, 8, 7, 5, 0, 3, 4, 2, 8, 2, 6, 0, 9, 2, 7, 5, 6, 5, 5, 9, 0, 5, 7, 7, 1, 6, 8, 1, 9, 9, 9, 0, 7, 5, 3, 3, 0, 8, 7, 3, 6, 2, 6, 8, 0, 3, 8, 1, 7, 4, 5, 3, 5, 2, 2, 0, 4, 4, 7, 2, 9, 3, 8, 7, 7, 3, 0, 8, 8, 4, 1, 6, 9, 6, 8, 8, 9, 9, 2, 1, 6, 7, 9, 2, 7, 8, 1, 4, 3, 6, 8, 6, 8, 1, 0, 2, 9, 3, 2, 7, 4, 8, 7, 9, 6, 5, 0, 5, 3, 5, 3, 0, 9, 9, 7, 1, 8, 8, 9, 8, 4, 0, 9, 1, 7, 5, 2, 8, 8, 7, 5, 3, 8, 1, 3, 2, 2, 5, 8, 8, 9, 3, 7, 5, 8, 0, 1, 3, 4, 5, 4, 6, 1, 5, 0, 3, 9, 9, 9, 3, 7, 5, 7, 3, 5, 0, 4, 1, 3, 7, 5, 5, 3, 5, 4, 1, 0, 4, 0, 8, 4, 3, 1, 7, 7, 6, 6, 0, 7, 0, 1, 8, 3, 6, 2, 1, 2, 1, 8, 1, 3, 7, 2, 5, 0, 2, 2, 3, 2, 7, 1, 6, 8, 6, 5, 3, 6, 7, 2, 9, 7, 2, 9, 0, 0, 2, 7, 2, 2, 4, 7, 3, 1, 6, 0, 6, 8, 2, 6, 8, 2, 0, 0, 2, 3, 3, 6, 9, 1, 7, 7, 6, 7, 9, 0, 5, 1, 7, 7, 5, 5, 2, 6, 3, 2, 8, 3, 4, 9, 3, 4, 9, 2, 9, 4, 7, 1, 6, 3, 6, 4, 0, 4, 2, 4, 1, 3, 7, 1, 7, 5, 6, 8, 4, 7, 8, 1, 1, 1, 6, 8, 4, 9, 7, 8, 0, 6, 4, 0, 0, 7, 2, 5, 5, 8, 0, 4, 9, 7, 8, 5, 6, 5, 6, 3, 6, 9, 3, 5, 0, 6, 3, 6, 0, 8, 8, 6, 4, 2, 3, 8, 8, 6, 4, 7, 9, 0, 1, 4, 0, 8, 8, 6, 4, 2, 6, 7, 0, 3, 5, 2, 9, 4, 0, 7, 6, 6, 9, 5, 7, 0, 0, 5, 7, 8, 6, 8, 2, 3, 9, 0, 0, 9, 6, 6, 4, 6, 4, 6, 0, 8, 6, 8, 6, 5, 0, 4, 3, 3, 1, 0, 8, 8, 3, 1, 7, 4, 5, 2, 1, 1, 4, 9, 0, 5, 7, 0, 4, 6, 9, 8, 1, 1, 2, 5, 0, 1, 4, 5, 6, 3, 9, 3, 6, 0, 1, 5, 6, 5, 0, 0, 8, 6, 5, 9, 7, 5, 9, 7, 0, 1, 6, 6, 3, 0, 4, 9, 7, 3, 3, 1, 5, 1, 8, 8, 2, 2, 1, 2, 1, 7, 2, 2, 8, 3, 9, 1, 8, 9, 7, 1, 8, 7, 1, 2, 9, 0, 9, 7, 1, 0, 5, 9, 1, 8, 6, 4, 4, 2, 2, 1, 2, 7, 7, 7, 5, 2, 1, 8, 2, 9, 7, 0, 7, 7, 1, 4, 0, 0, 4, 6, 5, 2, 9, 9, 8, 4, 4, 7, 8, 4, 5, 3, 3, 3, 7, 9, 6, 9, 1, 8, 3, 3, 3, 7, 8, 6, 9, 0, 3, 9, 7, 7, 9, 3, 1, 2, 3, 5, 4, 9, 8, 0, 0, 9, 9, 7, 0, 7, 6, 9, 5, 6, 6, 4, 5, 4, 0, 6, 4, 3, 7, 2, 6, 9, 7, 5, 9, 1, 4, 5, 2, 9, 7, 3, 1, 5, 1, 4, 9, 0, 3, 7, 1, 4, 9, 4, 2, 5, 0, 4, 0, 1, 6, 8, 4, 7, 6, 7, 1, 1, 6, 7, 5, 4, 9, 7, 7, 2, 2, 3, 2, 5, 5, 1, 8, 5, 7, 1, 7, 0, 2, 7, 0, 9, 8, 0, 6, 6, 1, 0, 5, 6, 6, 9, 3, 4, 2, 6, 8, 4, 6, 2, 1, 8, 5, 2, 0, 0, 2, 7, 0, 8, 8, 4, 5, 8, 5, 6, 9, 7, 5, 2, 1, 0, 5, 2, 8, 9, 9, 9, 8, 5, 7, 6, 7, 1, 8, 5, 0, 5, 1, 1, 9, 9, 8, 9, 8, 1, 8, 4, 8, 2, 6, 1, 1, 7, 6, 0, 2, 2, 9, 4, 3, 5, 1, 5, 7, 5, 6, 4, 0, 5, 3, 7, 9, 1, 9, 3, 2, 7, 0, 3, 5, 0, 7, 0, 8, 6, 0, 2, 3, 6, 5, 9, 1, 7, 9, 1, 1, 3, 8, 8, 2, 7, 6, 6, 7, 1, 3, 4, 9, 0, 5, 2, 6, 3, 0, 9, 0, 2, 6, 0, 2, 5, 3, 9, 8, 8, 2, 8, 5, 5, 4, 3, 0, 7, 1, 6, 2, 3, 6, 4, 5, 9, 2, 3, 7, 2, 3, 9, 2, 3, 7, 6, 6, 2, 7, 7, 4, 5, 5, 0, 2, 0, 7, 0, 3, 0, 2, 2, 9, 5, 6, 2, 4, 0, 2, 6, 3, 5, 3, 2, 6, 1, 6, 6, 1, 0, 8, 5, 0, 8, 5, 2, 3, 0, 3, 9, 8, 6, 8, 0, 5, 9, 4, 9, 5, 9, 8, 4, 9, 6, 4, 0, 5, 6, 9, 6, 3, 5, 5, 1, 4, 1, 6, 8, 5, 5, 9, 3, 9, 8, 7, 6, 9, 2, 7, 8, 1, 3, 1, 6, 4, 6, 6, 5, 7, 0, 3, 0, 1, 2, 9, 5, 7, 5, 4, 8, 9, 8, 2, 9, 7, 6, 8, 2, 4, 8, 8, 3, 1, 2, 2, 6, 7, 1, 0, 0, 6, 4, 1, 7, 2, 5, 6, 8, 6, 6, 2, 8, 1, 8, 2, 8, 7, 1, 1, 2, 5, 9, 6, 5, 0, 2, 2, 3, 9, 8, 5, 3, 2, 1, 8, 2, 1, 1, 5, 3, 5, 5, 7, 4, 5, 0, 7, 8, 4, 3, 7, 1, 5, 9, 4, 6, 7, 5, 9, 5, 3, 2, 0, 7, 4, 8, 2, 3, 7, 6, 2, 6, 4, 5, 5, 7, 1, 4, 9, 9, 1, 8, 4, 6, 7, 5, 4, 7, 4, 4, 8, 2, 8, 6, 8, 8, 2, 1, 6, 7, 1, 6, 4, 1, 0, 5, 3, 9, 0, 4, 5, 3, 2, 5, 1, 9, 5, 6, 1, 1, 2, 1, 4, 8, 2, 3, 9, 0, 5, 8, 1, 9, 9, 4, 9, 4, 9, 9, 6, 1, 3, 4, 8, 1, 7, 7, 1, 6, 7, 7, 7, 6, 6, 3, 1, 0, 2, 8, 3, 1, 9, 0, 4, 4, 3, 1, 3, 4, 4, 9, 1, 0, 8, 5, 8, 7, 9, 1, 4, 1, 8, 5, 7, 9, 1, 2, 4, 8, 1, 7, 5, 9, 4, 0, 7, 5, 8, 0, 8, 6, 6, 4, 2, 8, 3, 6, 8, 2, 7, 1, 4, 9, 0, 8, 5, 0, 4, 7, 4, 4, 2, 2, 1, 9, 6, 3, 0, 1, 7, 2, 5, 2, 8, 7, 6, 4, 8, 9, 3, 4, 6, 2, 8, 9, 0, 2, 1, 9, 7, 5, 2, 1, 3, 3, 6, 5, 4, 0, 1, 2, 0, 5, 0, 3, 6, 4, 7, 4, 4, 9, 6, 9, 1, 6, 8, 1, 6, 3, 8, 9, 7, 4, 2, 1, 6, 3, 5, 8, 5, 1, 1, 8, 2, 2, 9, 4, 8, 0, 3, 5, 2, 3, 5, 4, 3, 1, 7, 7, 9, 7, 3, 2, 1, 4, 5, 2, 9, 8, 2, 0, 3, 3, 5, 2, 4, 3, 0, 8, 0, 8, 7, 6, 6, 5, 3, 4, 1, 2, 7, 5, 7, 5, 1, 9, 4, 0, 8, 1, 5, 0, 5, 6, 1, 2, 9, 4, 9, 2, 7, 9, 6, 7, 7, 6, 5, 1, 3, 7, 3, 3, 0, 0, 1, 0, 2, 2, 4, 7, 0, 8, 6, 9, 5, 2, 1, 8, 7, 2, 7, 3, 1, 3, 0, 7, 5, 2, 5, 0, 2, 2, 2, 2, 6, 0, 0, 8, 1, 8, 9, 8, 7, 2, 2, 6, 2, 8, 1, 2, 2, 3, 0, 1, 7, 9, 2, 7, 8, 8, 4, 3, 6, 6, 1, 1, 7, 0, 2, 9, 6, 9, 3, 5, 2, 8, 6, 0, 7, 3, 1, 1, 0, 9, 8, 6, 6, 1, 9, 3, 7, 0, 4, 5, 5, 4, 8, 1, 1, 3, 4, 1, 1, 5, 1, 2, 1, 1, 0, 7, 1, 7, 1, 0, 8, 2, 3, 1, 1, 3, 6, 4, 6, 3, 7, 3, 5, 3, 1, 5, 5, 3, 0, 3, 6, 0, 4, 2, 8, 4, 4, 4, 7, 6, 3, 7, 9, 8, 9, 9, 3, 8, 9, 8, 0, 5, 1, 3, 8, 4, 3, 8, 9, 0, 6, 2, 8, 5, 8, 8, 5, 1, 6, 9, 5, 8, 1, 9, 1, 0, 5, 5, 6, 9, 6, 8, 6, 3, 8, 2, 4, 2, 4, 2, 7, 4, 8, 3, 7, 8, 5, 0, 0, 7, 1, 2, 8, 5, 5, 1, 1, 2, 5, 5, 6, 2, 6, 4, 1, 6, 7, 6, 7, 3, 2, 9, 2, 8, 0, 3, 9, 3, 5, 2, 3, 5, 4, 6, 5, 8, 9, 6, 4, 1, 5, 4, 4, 2, 4, 6, 8, 9, 7, 3, 8, 0, 3, 6, 8, 9, 7, 2, 4, 8, 8, 9, 9, 4, 1, 3, 1, 0, 0, 0, 8, 9, 4, 1, 1, 2, 6, 6, 1, 5, 8, 1, 3, 0, 7, 0, 4, 2, 9, 2, 9, 3, 3, 5, 7, 7, 7, 0, 7, 1, 7, 5, 4, 0, 0, 2, 5, 6, 4, 8, 9, 3, 6, 5, 5, 6, 5, 0, 0, 5, 9, 7, 0, 2, 7, 6, 9, 8, 0, 2, 9, 6, 2, 8, 1, 3, 1, 5, 4, 1, 4, 5, 8, 0, 5, 1, 4, 4, 1, 9, 6, 7, 9, 3, 9, 0, 5, 2, 7, 3, 2, 2, 9, 6, 2, 5, 1, 7, 0, 5, 6, 2, 5, 0, 2, 8, 9, 6, 3, 0, 2, 6, 0, 0, 8, 8, 7, 8, 3, 1, 0, 3, 2, 0, 2, 3, 9, 1, 0, 5, 9, 6, 5, 3, 8, 6, 0, 9, 3, 5, 9, 4, 3, 4, 4, 7, 2, 5, 7, 1, 1, 2, 9, 7, 8, 2, 5, 4, 1, 8, 6, 6, 5, 5, 8, 6, 8, 1, 5, 7, 7, 6, 7, 3, 4, 0, 7, 2, 4, 3, 0, 2, 5, 6, 1, 3, 2, 1, 0, 0, 1, 7, 8, 1, 2, 2, 0, 8, 2, 9, 1, 4, 6, 3, 7, 7, 2, 0, 0, 2, 4, 6, 7, 0, 4, 4, 8, 0, 0, 6, 5, 9, 7, 9, 6, 7, 1, 4, 5, 7, 7, 0, 0, 0, 2, 9, 4, 0, 2, 0, 9, 8, 1, 0, 2, 3, 1, 8, 5, 9, 0, 2, 0, 8, 6, 2, 8, 2, 0, 4, 0, 9, 6, 0, 4, 6, 2, 7, 6, 1, 7, 1, 9, 9, 3, 9, 6, 5, 2, 0, 6, 9, 6, 7, 4, 5, 6, 1, 6, 3, 6, 7, 6, 7, 1, 2, 2, 0, 0, 8, 4, 2, 1, 5, 2, 7, 8, 6, 2, 7, 9, 2, 3, 6, 6, 7, 5, 9, 9, 4, 4, 0, 0, 9, 6, 2, 7, 3, 8, 1, 3, 6, 1, 0, 4, 1, 6, 6, 6, 6, 2, 1, 4, 1, 7, 1, 5, 8, 6, 9, 3, 6, 4, 4, 4, 1, 6, 4, 4, 3, 8, 0, 0, 3, 4, 5, 3, 2, 4, 1, 1, 6, 9, 4, 2, 8, 3, 4, 7, 2, 5, 9, 9, 6, 5, 3, 4, 2, 4, 1, 6, 5, 7, 1, 8, 9, 7, 9, 1, 6, 0, 1, 0, 5, 6, 0, 9, 7, 2, 9, 3, 2, 2, 2, 2, 9, 8, 8, 2, 4, 4, 7, 0, 3, 0, 4, 8, 1, 8, 0, 3, 5, 0, 1, 8, 0, 5, 8, 6, 4, 4, 9, 4, 1, 7, 0, 5, 0, 4, 0, 7, 3, 5, 9, 3, 8, 6, 2, 0, 7, 0, 0, 7, 0, 8, 6, 3, 2, 4, 0, 0, 1, 1, 3, 9, 3, 9, 4, 1, 2, 6, 2, 7, 1, 2, 6, 2, 9, 6, 5, 6, 3, 9, 7, 2, 6, 8, 5, 5, 1, 5, 1, 8, 7, 0, 4, 5, 8, 5, 3, 2, 8, 3, 2, 6, 7, 5, 0, 5, 9, 1, 0, 4, 0, 8, 7, 6, 6, 3, 6, 3, 9, 4, 5, 8, 9, 5, 7, 4, 4, 4, 8, 6, 4, 2, 6, 1, 3, 1, 6, 7, 2, 6, 4, 4, 1, 0, 2, 1, 6, 7, 5, 8, 7, 3, 4, 0, 6, 4, 7, 6, 9, 7, 2, 5, 5, 7, 9, 1, 6, 7, 1, 2, 5, 3, 4, 4, 2, 5, 4, 0, 0, 9, 7, 3, 8, 6, 2, 0, 2, 0, 5, 8, 0, 5, 0, 7, 4, 5, 7, 5, 0, 8, 4, 3, 2, 7, 3, 2, 4, 2, 3, 1, 2, 5, 9, 7, 9, 0, 8, 1, 3, 4, 7, 3, 4, 6, 9, 7, 4, 4, 2, 5, 1, 4, 4, 2, 9, 9, 2, 7, 0, 5, 2, 3, 9, 4, 3, 2, 8, 1, 2, 0, 1, 4, 3, 5, 5, 7, 6, 0, 7, 8, 5, 6, 0, 6, 6, 0, 3, 6, 1, 8, 7, 1, 3, 7, 9, 8, 9, 9, 4, 0, 5, 5, 1, 7, 8, 0, 7, 0, 0, 7, 3, 7, 8, 6, 4, 5, 7, 9, 3, 1, 1, 4, 8, 8, 6, 7, 1, 3, 4, 1, 4, 3, 8, 2, 1, 6, 5, 1, 4, 2, 1, 8, 5, 6, 2, 9, 4, 0, 1, 0, 5, 8, 2, 0, 0, 0, 4, 6, 2, 0, 2, 3, 2, 1, 3, 4, 1, 1, 3, 0, 0, 6, 9, 6, 6, 0, 3, 8, 1, 3, 0, 9, 6, 2, 6, 5, 6, 0, 3, 8, 4, 1, 8, 8, 9, 0, 2, 4, 4, 2, 8, 2, 3, 4, 0, 1, 1, 7, 1, 6, 1, 8, 2, 7, 6, 6, 9, 7, 9, 2, 5, 8, 2, 3, 2, 3, 3, 5, 0, 7, 5, 8, 2, 9, 4, 7, 3, 7, 8, 4, 2, 6, 8, 2, 0, 2, 7, 9, 2, 9, 0, 0, 1, 4, 8, 9, 2, 0, 4, 0, 4, 8, 7, 9, 7, 2, 2, 4, 1, 3, 2, 2, 1, 9, 6, 6, 2, 4, 6, 6, 7, 1, 0, 2, 4, 3, 5, 7, 1, 0, 6, 4, 0, 0, 3, 3, 1, 7, 8, 0, 2, 1, 6, 9, 9, 7, 7, 2, 0, 2, 2, 6, 2, 4, 7, 1, 2, 7, 1, 2, 2, 4, 4, 6, 9, 2, 9, 0, 3, 0, 0, 6, 1, 6, 9, 4, 9, 3, 8, 4, 6, 4, 0, 7, 6, 3, 0, 5, 2, 4, 9, 2, 8, 3, 7, 1, 8, 2, 1, 9, 6, 4, 4, 6, 8, 9, 4, 7, 0, 4, 3, 4, 9, 9, 6, 8, 6, 1, 3, 9, 3, 8, 1, 0, 8, 5, 7, 7, 7, 4, 9, 4, 4, 5, 8, 6, 1, 4, 8, 2, 2, 0, 5, 4, 0, 5, 8, 4, 1, 4, 2, 6, 0, 3, 2, 0, 7, 1, 8, 2, 9, 1, 4, 5, 6, 2, 9, 6, 0, 6, 8, 6, 8, 3, 4, 8, 7, 9, 3, 7, 8, 4, 6, 4, 7, 0, 2, 3, 0, 4, 4, 0, 4, 0, 3, 0, 7, 9, 4, 9, 5, 3, 3, 0, 1, 6, 3, 5, 9, 6, 4, 4, 7, 3, 5, 5, 4, 2, 7, 5, 6, 3, 8, 6, 4, 5, 7, 6, 8, 1, 7, 2, 7, 7, 6, 7, 0, 3, 9, 9, 5, 7, 5, 2, 0, 7, 9, 7, 1, 1, 8, 6, 4, 4, 8, 4, 1, 4, 1, 5, 2, 0, 6, 0, 1, 8, 0, 7, 4, 1, 1, 3, 4, 9, 3, 7, 8, 7, 6, 7, 1, 9, 0, 9, 4, 5, 7, 5, 7, 8, 9, 6, 4, 0, 4, 1, 1, 4, 1, 0, 1, 6, 7, 2, 7, 1, 4, 8, 2, 4, 1, 0, 9, 0, 9, 4, 1, 9, 2, 3, 3, 4, 0, 7, 3, 3, 9, 0, 7, 7, 1, 8, 6, 4, 0, 4, 7, 4, 0, 8, 1, 2, 1, 3, 6, 2, 9, 2, 8, 4, 1, 4, 1, 1, 6, 8, 1, 4, 2, 9, 2, 4, 4, 2, 8, 0, 5, 7, 1, 7, 5, 9, 1, 7, 5, 2, 7, 6, 2, 9, 2, 9, 2, 1, 2, 6, 2, 8, 3, 9, 7, 1, 0, 3, 1, 4, 6, 1, 6, 5, 4, 9, 0, 9, 2, 0, 5, 7, 9, 2, 5, 9, 2, 1, 3, 4, 8, 9, 1, 3, 3, 7, 2, 6, 6, 1, 7, 6, 4, 0, 8, 6, 2, 8, 1, 3, 6, 6, 7, 7, 3, 7, 6, 7, 0, 2, 2, 2, 1, 3, 3, 3, 6, 2, 2, 2, 1, 8, 2, 0, 4, 4, 2, 4, 3, 1, 9, 5, 8, 3, 3, 4, 5, 8, 5, 7, 7, 8, 4, 7, 1, 6, 0, 7, 9, 0, 0, 9, 0, 4, 9, 2, 8, 8, 9, 1, 5, 7, 9, 4, 6, 0, 2, 9, 2, 0, 9, 1, 0, 6, 7, 5, 4, 4, 6, 0, 0, 6, 5, 2, 8, 2, 2, 2, 7, 8, 5, 6, 5, 5, 8, 4, 4, 1, 7, 8, 5, 5, 3, 8, 8, 2, 7, 9, 5, 7, 7, 3, 9, 0, 8, 0, 6, 0, 2, 2, 7, 6, 4, 1, 3, 2, 6, 3, 7, 4, 3, 8, 4, 7, 7, 9, 2, 1, 5, 7, 1, 3, 5, 3, 9, 0, 0, 4, 0, 0, 5, 2, 1, 5, 8, 8, 2, 4, 7, 1, 4, 8, 4, 9, 4, 3, 3, 5, 3, 8, 1, 0, 1, 7, 7, 0, 7, 4, 1, 4, 7, 2, 8, 0, 0, 7, 1, 3, 5, 7, 6, 7, 1, 9, 7, 5, 3, 7, 0, 1, 9, 9, 2, 7, 5, 2, 8, 1, 0, 3, 9, 0, 7, 7, 0, 0, 1, 6, 3, 5, 4, 9, 3, 6, 7, 7, 4, 5, 7, 9, 0, 1, 1, 1, 0, 0, 1, 1, 0, 6, 2, 6, 6, 9, 7, 4, 0, 4, 3, 7, 3, 8, 9, 8, 0, 4, 3, 2, 2, 6, 1, 2, 3, 9, 3, 0, 9, 4, 9, 0, 6, 4, 9, 8, 1, 2, 9, 9, 3, 9, 3, 7, 6, 0, 2, 2, 6, 8, 5, 8, 4, 5, 3, 7, 7, 2, 9, 0, 9, 4, 8, 2, 5, 4, 3, 3, 4, 5, 4, 4, 8, 4, 5, 1, 8, 9, 7, 1, 9, 0, 8, 3, 7, 0, 5, 4, 7, 6, 6, 7, 9, 4, 4, 4, 5, 4, 7, 7, 9, 9, 1, 7, 5, 3, 7, 4, 5, 9, 9, 0, 8, 2, 1, 3, 9, 6, 1, 9, 8, 9, 5, 2, 0, 3, 6, 9, 2, 8, 6, 0, 8, 6, 7, 7, 8, 6, 6, 3, 2, 9, 6, 1, 1, 4, 0, 1, 3, 2, 2, 1, 1, 8, 9, 6, 8, 6, 4, 6, 8, 3, 5, 5, 1, 3, 4, 1, 1, 2, 6, 3, 9, 3, 7, 4, 2, 1, 8, 8, 0, 1, 8, 9, 4, 5, 9, 0, 0, 8, 4, 0, 6, 6, 1, 2, 8, 5, 8, 2, 4, 9, 9, 9, 0, 7, 3, 7, 0, 9, 9, 6, 6, 5, 0, 6, 1, 2, 8, 2, 3, 6, 8, 2, 9, 9, 0, 9, 8, 6, 2, 2, 6, 7, 9, 2, 0, 6, 1, 1, 6, 1, 3, 0, 7, 6, 0, 0, 0, 1, 4, 8, 0, 2, 1, 9, 7, 1, 8, 4, 8, 1, 0, 7, 2, 2, 5, 9, 7, 2, 9, 0, 1, 1, 3, 8, 0, 5, 2, 2, 6, 2, 1, 7, 8, 0, 2, 3, 7, 4, 3, 0, 5, 3, 9, 7, 4, 9, 9, 5, 2, 8, 1, 5, 8, 7, 0, 9, 0, 0, 9, 8, 0, 2, 8, 4, 5, 5, 5, 4, 7, 6, 5, 3, 6, 0, 5, 1, 0, 1, 2, 7, 0, 2, 6, 8, 9, 2, 4, 5, 9, 4, 1, 7, 2, 9, 9, 3, 3, 0, 0, 2, 6, 2, 3, 8, 8, 1, 6, 2, 3, 6, 5, 0, 9, 2, 0, 3, 0, 9, 1, 3, 2, 3, 2, 9, 1, 4, 2, 7, 0, 6, 1, 3, 9, 3, 5, 5, 5, 1, 3, 2, 6, 6, 8, 2, 7, 8, 2, 9, 9, 7, 8, 4, 8, 9, 3, 6, 7, 7, 1, 5, 1, 5, 5, 0, 8, 0, 7, 2, 9, 7, 3, 6, 1, 8, 2, 8, 8, 1, 7, 0, 2, 3, 3, 4, 9, 3, 5, 0, 1, 8, 4, 7, 9, 5, 8, 2, 8, 0, 5, 4, 5, 8, 0, 2, 1, 2, 9, 4, 8, 3, 0, 5, 3, 0, 9, 4, 2, 0, 6, 3, 2, 7, 2, 5, 2, 5, 7, 0, 8, 6, 8, 5, 3, 1, 3, 4, 6, 8, 2, 4, 8, 2, 7, 1, 8, 1, 0, 2, 0, 3, 4, 4, 2, 3, 7, 7, 6, 1, 4, 4, 6, 5, 5, 7, 3, 2, 6, 7, 3, 4, 3, 8, 6, 4, 4, 6, 9, 9, 9, 2, 8, 2, 6, 8, 8, 4, 2, 8, 4, 3, 6, 1, 1, 4, 0, 7, 7, 2, 3, 8, 1, 2, 9, 3, 6, 0, 7, 5, 8, 0, 8, 7, 1, 3, 7, 5, 8, 4, 1, 9, 2, 8, 5, 0, 2, 6, 7, 6, 6, 0, 5, 8, 3, 9, 7, 3, 5, 5, 3, 8, 4, 5, 1, 6, 7, 0, 0, 2, 0, 7, 8, 1, 8, 4, 6, 6, 6, 7, 2, 1, 4, 2, 4, 1, 0, 6, 9, 1, 5, 6, 4, 4, 2, 1, 5, 2, 8, 0, 0, 7, 2, 1, 5, 4, 3, 6, 2, 5, 7, 2, 9, 5, 8, 0, 6, 8, 6, 7, 0, 7, 6, 1, 9, 6, 9, 0, 5, 1, 9, 1, 1, 2, 3, 2, 3, 8, 8, 7, 1, 2, 7, 4, 7, 7, 1, 7, 8, 1, 9, 6, 5, 4, 1, 6, 6, 3, 0, 2, 0, 5, 7, 2, 6, 2, 8, 5, 2, 6, 1, 5, 3, 6, 2, 6, 1, 6, 9, 4, 5, 0, 3, 0, 9, 1, 3, 7, 8, 0, 8, 8, 4, 2, 3, 5, 6, 5, 3, 2, 8, 0, 6, 7, 1, 7, 0, 8, 6, 9, 1, 7, 8, 3, 2, 6, 4, 2, 8, 9, 0, 2, 0, 1, 5, 9, 6, 4, 7, 4, 8, 4, 4, 5, 2, 7, 5, 6, 4, 5, 9, 1, 4, 2, 3, 7, 3, 6, 3, 1, 3, 0, 2, 1, 5, 0, 3, 1, 2, 5, 1, 6, 5, 0, 7, 0, 8, 1, 2, 3, 0, 3, 3, 2, 9, 2, 0, 1, 6, 6, 1, 4, 4, 2, 5, 4, 2, 9, 3, 4, 1, 0, 2, 5, 5, 6, 9, 4, 7, 4, 4, 0, 2, 9, 6, 3, 4, 3, 0, 3, 2, 5, 8, 4, 4, 0, 9, 7, 9, 8, 8, 0, 0, 6, 6, 4, 3, 7, 0, 4, 4, 5, 1, 9, 1, 3, 8, 7, 0, 0, 0, 2, 8, 6, 8, 7, 0, 5, 0, 0, 1, 5, 7, 7, 1, 1, 5, 4, 1, 5, 2, 7, 0, 3, 7, 3, 8, 0, 8, 5, 7, 0, 2, 2, 1, 3, 6, 5, 1, 0, 2, 1, 8, 9, 9, 2, 0, 3, 9, 8, 7, 7, 6, 3, 7, 1, 6, 0, 9, 0, 0, 4, 1, 4, 0, 5, 6, 3, 7, 2, 0, 4, 6, 2, 4, 4, 6, 3, 2, 7, 4, 2, 9, 6, 0, 9, 9, 0, 1, 2, 8, 6, 4, 6, 8, 0, 4, 5, 8, 7, 6, 7, 8, 6, 7, 5, 6, 7, 5, 9, 5, 2, 6, 1, 1, 5, 8, 4, 8, 3, 9, 4, 4, 0, 7, 0, 3, 4, 3, 7, 9, 0, 5, 8, 9, 0, 9, 2, 4, 4, 0, 9, 1, 3, 1, 9, 7, 9, 3, 6, 9, 6, 5, 7, 8, 0, 2, 4, 3, 7, 5, 5, 6, 1, 8, 7, 6, 9, 7, 3, 0, 3, 6, 4, 4, 1, 8, 1, 4, 4, 4, 6, 1, 8, 6, 8, 9, 2, 2, 3, 8, 2, 0, 8, 8, 8, 7, 2, 2, 0, 3, 6, 6, 9, 3, 7, 0, 6, 9, 3, 3, 3, 2, 9, 0, 0, 5, 0, 5, 7, 4, 3, 9, 0, 2, 9, 6, 4, 3, 3, 9, 9, 4, 5, 5, 4, 8, 0, 1, 7, 8, 1, 1, 3, 0, 5, 3, 1, 8, 2, 6, 2, 8, 2, 2, 6, 1, 3, 8, 6, 6, 0, 5, 1, 0, 3, 9, 1, 8, 5, 6, 1, 3, 9, 6, 4, 6, 8, 2, 7, 4, 8, 8, 2, 3, 7, 7, 9, 1, 3, 5, 1, 8, 7, 2, 1, 9, 1, 5, 1, 9, 9, 7, 8, 4, 1, 0, 8, 3, 7, 3, 8, 3, 9, 0, 3, 9, 2, 8, 9, 3, 8, 3, 8, 2, 8, 5, 9, 4, 3, 8, 9, 7, 4, 8, 7, 7, 7, 7, 0, 8, 6, 0, 1, 2, 0, 4, 0, 1, 6, 0, 0, 7, 5, 3, 8, 3, 3, 3, 0, 8, 7, 8, 8, 7, 8, 0, 8, 5, 8, 7, 0, 5, 6, 7, 7, 9, 3, 0, 4, 5, 4, 9, 9, 2, 6, 7, 7, 6, 5, 7, 0, 0, 1, 1, 1, 0, 7, 8, 7, 9, 1, 1, 6, 8, 6, 1, 3, 3, 4, 1, 7, 5, 2, 8, 4, 3, 8, 4, 3, 2, 8, 7, 6, 2, 5, 6, 6, 6, 6, 4, 9, 3, 2, 9, 4, 3, 0, 8, 8, 9, 8, 6, 6, 1, 8, 3, 4, 6, 6, 9, 4, 8, 8, 4, 9, 5, 5, 3, 9, 8, 5, 4, 5, 2, 9, 2, 4, 5, 8, 0, 9, 6, 6, 7, 1, 0, 8, 4, 1, 6, 0, 1, 4, 4, 7, 5, 7, 6, 9, 1, 4, 8, 7, 1, 9, 6, 8, 9, 2, 7, 2, 9, 3, 5, 5, 8, 6, 2, 2, 3, 8, 4, 2, 2, 2, 1, 4, 6, 3, 6, 0, 6, 4, 5, 3, 0, 3, 0, 0, 9, 0, 8, 4, 0, 9, 5, 1, 2, 5, 9, 4, 4, 8, 5, 7, 6, 7, 8, 5, 6, 5, 5, 5, 8, 2, 2, 9, 1, 8, 3, 8, 3, 6, 5, 7, 0, 2, 0, 2, 9, 6, 3, 0, 2, 6, 3, 6, 2, 1, 5, 2, 1, 3, 3, 2, 6, 1, 2, 4, 7, 5, 3, 7, 1, 5, 8, 4, 1, 2, 5, 0, 9, 2, 1, 1, 9, 2, 7, 2, 3, 7, 6, 2, 0, 2, 4, 4, 6, 0, 2, 0, 8, 2, 9, 1, 2, 1, 8, 6, 9, 4, 1, 4, 2, 9, 8, 1, 0, 7, 7, 9, 3, 8, 8, 3, 7, 1, 4, 7, 9, 0, 6, 6, 8, 2, 7, 0, 9, 0, 7, 4, 6, 5, 6, 5, 0, 5, 7, 1, 2, 4, 1, 1, 7, 9, 6, 9, 6, 9, 2, 5, 3, 9, 7, 1, 9, 5, 1, 8, 1, 1, 5, 9, 4, 0, 9, 2, 8, 9, 8, 2, 2, 3, 3, 2, 2, 9, 1, 1, 1, 0, 3, 0, 1, 0, 5, 2, 1, 2, 0, 6, 1, 3, 7, 1, 2, 6, 4, 5, 0, 6, 6, 6, 6, 4, 0, 0, 1, 4, 6, 1, 2, 5, 0, 7, 7, 1, 2, 3, 1, 3, 2, 5, 1, 7, 1, 0, 8, 9, 0, 0, 3, 1, 5, 6, 6, 6, 3, 1, 4, 8, 7, 2, 1, 2, 3, 0, 2, 8, 0, 9, 6, 9, 4, 0, 1, 1, 0, 6, 0, 3, 2, 7, 6, 6, 3, 9, 6, 2, 2, 2, 5, 1, 4, 9, 5, 8, 5, 9, 2, 9, 1, 7, 2, 1, 4, 6, 6, 2, 2, 0, 8, 9, 5, 0, 6, 6, 7, 2, 9, 6, 3, 6, 9, 9, 2, 7, 9, 8, 8, 1, 3, 7, 9, 6, 6, 5, 4, 8, 4, 8, 2, 4, 9, 9, 7, 8, 9, 6, 0, 6, 2, 9, 2, 9, 2, 7, 5, 6, 7, 0, 1, 1, 9, 8, 3, 7, 7, 3, 6, 8, 2, 2, 3, 2, 5, 2, 4, 8, 3, 2, 6, 7, 3, 2, 1, 4, 2, 7, 2, 6, 5, 0, 0, 0, 5, 1, 9, 2, 6, 4, 8, 9, 8, 4, 4, 3, 6, 7, 4, 7, 9, 4, 4, 7, 8, 4, 3, 9, 2, 3, 4, 7, 4, 0, 7, 5, 5, 6, 9, 2, 8, 3, 1, 8, 0, 5, 2, 9, 3, 3, 0, 8, 7, 4, 2, 7, 1, 0, 7, 1, 0, 5, 0, 6, 4, 2, 8, 3, 2, 7, 2, 6, 3, 5, 2, 0, 2, 7, 6, 1, 6, 1, 0, 8, 2, 2, 0, 3, 1, 1, 5, 9, 0, 8, 0, 9, 5, 7, 9, 2, 4, 7, 1, 4, 4, 3, 3, 5, 8, 7, 3, 6, 6, 6, 4, 0, 0, 1, 2, 7, 0, 5, 6, 0, 1, 6, 1, 9, 5, 1, 0, 2, 1, 2, 1, 5, 3, 4, 6, 8, 4, 8, 0, 2, 4, 8, 6, 5, 1, 9, 0, 0, 2, 6, 3, 4, 7, 7, 1, 6, 4, 7, 4, 3, 6, 8, 5, 9, 0, 7, 7, 7, 7, 6, 6, 9, 1, 2, 0, 0, 8, 2, 8, 9, 9, 6, 4, 4, 3, 1, 0, 7, 9, 6, 0, 3, 4, 0, 5, 4, 7, 8, 3, 6, 0, 9, 3, 7, 0, 1, 4, 5, 2, 7, 4, 9, 0, 8, 0, 0, 4, 7, 9, 4, 7, 3, 5, 1, 9, 9, 3, 2, 4, 2, 7, 9, 9, 6, 8, 3, 3, 7, 5, 1, 7, 5, 4, 9, 1, 3, 5, 2, 5, 5, 9, 4, 4, 1, 7, 8, 5, 1, 9, 1, 7, 7, 1, 0, 2, 9, 3, 3, 7, 2, 5, 9, 0, 6, 3, 0, 6, 8, 6, 8, 8, 0, 7, 4, 5, 7, 0, 7, 1, 4, 4, 7, 4, 6, 7, 2, 3, 2, 4, 7, 0, 8, 9, 7, 4, 9, 1, 0, 3, 9, 5, 3, 5, 7, 4, 8, 2, 9, 6, 9, 1, 8, 1, 0, 9, 0, 9, 6, 8, 9, 2, 2, 1, 2, 8, 2, 4, 5, 2, 0, 8, 7, 5, 5, 4, 0, 2, 0, 7, 5, 1, 2, 1, 5, 5, 1, 2, 7, 3, 8, 7, 2, 2, 4, 9, 7, 5, 2, 4, 4, 9, 2, 1, 0, 7, 2, 9, 1, 3, 4, 4, 8, 9, 1, 0, 4, 8, 7, 9, 7, 3, 8, 3, 2, 6, 7, 1, 1, 3, 5, 6, 1, 8, 7, 4, 4, 1, 5, 5, 0, 4, 5, 6, 4, 5, 5, 0, 6, 3, 9, 5, 9, 1, 7, 0, 7, 7, 2, 1, 2, 9, 7, 5, 8, 1, 9, 9, 4, 7, 2, 8, 8, 5, 2, 4, 0, 1, 4, 9, 0, 7, 3, 0, 4, 3, 9, 2, 3, 1, 8, 1, 0, 8, 1, 2, 6, 4, 1, 2, 2, 2, 4, 4, 9, 3, 2, 7, 6, 5, 4, 1, 9, 3, 8, 4, 6, 9, 7, 8, 8, 8, 6, 0, 8, 5, 6, 4, 8, 0, 8, 7, 9, 3, 0, 3, 2, 5, 2, 1, 4, 9, 4, 3, 5, 2, 8, 8, 5, 6, 7, 2, 7, 8, 2, 1, 1, 5, 2, 4, 6, 0, 6, 8, 0, 6, 2, 5, 5, 7, 0, 0, 3, 4, 7, 7, 5, 1, 8, 3, 1, 4, 5, 7, 0, 2, 3, 1, 0, 1, 0, 5, 4, 6, 4, 8, 4, 1, 1, 4, 0, 9, 8, 3, 7, 6, 4, 1, 8, 9, 3, 0, 0, 6, 3, 2, 9, 3, 0, 0, 6, 4, 7, 0, 1, 3, 4, 7, 9, 0, 1, 4, 8, 0, 1, 8, 6, 7, 5, 7, 2, 6, 7, 3, 8, 9, 7, 2, 2, 6, 7, 8, 9, 1, 6, 5, 1, 4, 7, 4, 2, 7, 6, 6, 1, 2, 4, 6, 9, 4, 6, 2, 3, 3, 0, 2, 2, 8, 4, 3, 4, 6, 3, 5, 4, 0, 8, 6, 6, 8, 9, 0, 9, 1, 5, 4, 5, 3, 1, 0, 5, 4, 5, 9, 4, 9, 7, 1, 6, 0, 1, 3, 8, 6, 5, 0, 7, 6, 7, 7, 8, 4, 1, 8, 8, 6, 3, 1, 4, 8, 3, 8, 3, 1, 4, 9, 6, 7, 5, 7, 7, 4, 7, 2, 1, 7, 2, 2, 2, 7, 7, 6, 0, 0, 9, 8, 4, 7, 6, 6, 8, 0, 1, 8, 0, 6, 3, 9, 6, 7, 8, 9, 4, 5, 2, 5, 0, 6, 9, 8, 2, 7, 7, 1, 9, 3, 3, 7, 0, 7, 2, 8, 3, 8, 1, 1, 2, 1, 8, 4, 2, 1, 3, 3, 7, 1, 7, 1, 5, 9, 9, 6, 9, 1, 6, 2, 7, 5, 0, 9, 3, 2, 5, 1, 7, 2, 0, 8, 9, 7, 3, 1, 5, 0, 9, 1, 1, 0, 6, 3, 1, 3, 1, 4, 7, 5, 0, 2, 6, 9, 7, 7, 4, 1, 4, 6, 3, 1, 2, 0, 4, 6, 3, 4, 4, 4, 8, 5, 7, 1, 7, 9, 3, 7, 0, 6, 6, 7, 4, 8, 8, 5, 3, 6, 2, 7, 0, 5, 2, 3, 5, 2, 6, 7, 2, 0, 6, 1, 2, 0, 3, 6, 1, 3, 0, 1, 5, 0, 0, 2, 2, 0, 1, 2, 3, 2, 1, 5, 4, 8, 8, 3, 9, 1, 0, 8, 4, 4, 5, 1, 7, 0, 3, 2, 7, 6, 2, 0, 4, 1, 5, 7, 9, 3, 1, 0, 1, 9, 7, 7, 9, 0, 5, 2, 7, 8, 7, 4, 8, 8, 4, 9, 9, 3, 2, 2, 5, 1, 5, 8, 4, 0, 0, 7, 4, 7, 6, 6, 6, 4, 2, 6, 4, 2, 1, 8, 1, 5, 6, 3, 5, 4, 1, 6, 3, 0, 1, 1, 3, 3, 8, 1, 5, 7, 7, 6, 2, 3, 6, 5, 8, 0, 9, 4, 7, 1, 0, 2, 5, 6, 5, 7, 3, 9, 9, 7, 5, 1, 2, 3, 1, 8, 6, 8, 8, 4, 7, 9, 7, 8, 8, 6, 3, 4, 7, 4, 0, 9, 5, 4, 4, 1, 6, 0, 9, 4, 0, 5, 1, 3, 2, 7, 6, 6, 1, 8, 6, 5, 8, 8, 4, 1, 9, 7, 1, 3, 8, 2, 3, 6, 7, 9, 8, 6, 3, 2, 1, 2, 6, 1, 1, 6, 6, 2, 2, 0, 7, 2, 1, 8, 8, 6, 3, 6, 6, 6, 2, 6, 9, 1, 3, 0, 9, 1, 8, 8, 8, 7, 7, 8, 8, 6, 0, 2, 2, 6, 7, 6, 3, 8, 1, 4, 8, 2, 1, 8, 6, 0, 7, 4, 3, 1, 6, 9, 3, 1, 2, 6, 6, 0, 9, 4, 3, 0, 5, 9, 7, 6, 7, 2, 7, 4, 7, 9, 5, 3, 2, 6, 1, 7, 2, 9, 3, 8, 0, 5, 2, 5, 2, 9, 5, 0, 5, 4, 1, 3, 8, 7, 9, 1, 2, 9, 9, 6, 8, 3, 4, 9, 7, 9, 9, 6, 7, 9, 0, 6, 1, 5, 9, 7, 7, 7, 2, 7, 0, 3, 9, 1, 2, 3, 3, 4, 2, 1, 5, 3, 4, 6, 3, 1, 9, 1, 2, 9, 2, 4, 8, 5, 1, 1, 3, 9, 2, 2, 7, 1, 5, 2, 8, 3, 4, 0, 5, 1, 2, 9, 4, 2, 0, 8, 9, 2, 1, 4, 2, 8, 8, 6, 6, 5, 2, 9, 8, 5, 0, 5, 0, 4, 5, 8, 9, 8, 3, 7, 5, 2, 8, 2, 4, 6, 1, 6, 7, 8, 3, 5, 1, 4, 1, 1, 0, 8, 2, 0, 0, 1, 9, 8, 4, 3, 2, 9, 3, 3, 7, 2, 6, 9, 8, 7, 0, 9, 0, 1, 8, 2, 7, 1, 2, 4, 0, 9, 4, 7, 9, 6, 7, 4, 0, 6, 8, 4, 6, 4, 2, 7, 1, 5, 4, 4, 9, 7, 7, 9, 7, 6, 8, 5, 7, 1, 2, 8, 8, 0, 4, 6, 0, 4, 9, 1, 5, 2, 0, 6, 1, 8, 2, 3, 2, 7, 4, 6, 3, 0, 7, 9, 5, 3, 1, 4, 3, 8, 2, 8, 3, 4, 9, 7, 8, 9, 5, 9, 0, 8, 6, 2, 2, 6, 1, 1, 9, 9, 7, 5, 9, 1, 3, 7, 5, 6, 5, 4, 0, 9, 6, 7, 2, 0, 3, 0, 6, 2, 1, 5, 7, 4, 0, 5, 4, 1, 6, 7, 0, 5, 9, 2, 5, 1, 3, 1, 5, 3, 6, 7, 9, 0, 3, 6, 5, 1, 7, 4, 0, 2, 5, 5, 0, 9, 7, 3, 7, 5, 9, 0, 8, 8, 1, 6, 2, 1, 1, 0, 3, 3, 3, 8, 0, 2, 3, 2, 6, 1, 4, 4, 7, 6, 6, 2, 4, 7, 0, 7, 6, 3, 2, 8, 9, 8, 1, 9, 6, 8, 0, 7, 2, 5, 6, 0, 7, 2, 1, 1, 4, 6, 8, 8, 7, 1, 3, 7, 1, 7, 7, 7, 9, 2, 8, 5, 0, 0, 7, 3, 5, 3, 4, 7, 0, 7, 8, 9, 3, 5, 7, 8, 5, 5, 6, 3, 5, 7, 8, 5, 5, 0, 8, 8, 0, 6, 6, 4, 3, 2, 9, 2, 4, 1, 3, 8, 5, 9, 9, 9, 6, 2, 1, 8, 5, 0, 3, 4, 5, 5, 0, 5, 8, 7, 7, 4, 8, 3, 9, 2, 1, 9, 9, 1, 7, 0, 8, 0, 2, 0, 0, 6, 2, 5, 3, 8, 9, 0, 6, 7, 4, 3, 4, 3, 3, 7, 1, 1, 3, 9, 9, 3, 8, 9, 5, 9, 6, 1, 5, 3, 1, 0, 2, 4, 6, 3, 0, 2, 7, 2, 2, 2, 0, 4, 1, 6, 0, 4, 5, 1, 3, 9, 0, 7, 5, 1, 1, 6, 9, 6, 9, 0, 5, 4, 9, 4, 8, 4, 8, 7, 5, 0, 7, 1, 2, 9, 4, 0, 2, 3, 4, 0, 7, 0, 1, 4, 6, 9, 0, 4, 4, 4, 8, 4, 2, 8, 3, 8, 2, 8, 2, 6, 3, 1, 6, 5, 8, 0, 9, 1, 7, 0, 5, 2, 2, 1, 8, 8, 2, 1, 0, 9, 2, 3, 0, 6, 2, 3, 0, 7, 9, 3, 9, 4, 7, 7, 6, 8, 7, 2, 0, 4, 9, 7, 6, 5, 4, 9, 0, 6, 5, 4, 7, 7, 5, 6, 8, 0, 7, 5, 5, 2, 1, 4, 0, 8, 2, 5, 8, 2, 4, 4, 2, 9, 1, 5, 5, 5, 4, 9, 7, 2, 3, 5, 5, 2, 2, 3, 1, 9, 2, 9, 3, 4, 8, 4, 3, 4, 5, 9, 8, 2, 1, 4, 0, 7, 1, 1, 5, 2, 0, 5, 8, 3, 1, 7, 5, 4, 3, 5, 8, 4, 1, 9, 6, 0, 7, 1, 4, 9, 3, 6, 2, 1, 5, 5, 5, 5, 1, 0, 7, 2, 7, 2, 1, 1, 3, 8, 8, 5, 7, 6, 1, 0, 2, 0, 4, 8, 7, 4, 4, 2, 6, 8, 4, 7, 3, 1, 7, 4, 3, 1, 4, 4, 3, 7, 2, 9, 8, 3, 0, 8, 7, 2, 7, 7, 8, 9, 7, 8, 8, 4, 2, 2, 9, 6, 6, 7, 8, 6, 1, 7, 8, 2, 7, 7, 5, 4, 8, 0, 1, 3, 6, 2, 5, 9, 0, 4, 3, 7, 1, 5, 8, 3, 2, 8, 7, 5, 7, 8, 0, 9, 6, 2, 8, 0, 0, 2, 9, 2, 9, 7, 8, 5, 7, 4, 9, 9, 9, 8, 4, 1, 9, 1, 1, 0, 0, 4, 7, 9, 5, 8, 3, 5, 4, 9, 6, 9, 2, 9, 8, 0, 0, 9, 0, 2, 6, 2, 0, 1, 2, 3, 4, 5, 1, 3, 4, 5, 6, 8, 7, 2, 4, 4, 8, 4, 3, 7, 3, 2, 9, 0, 8, 7, 7, 6, 6, 7, 2, 5, 3, 8, 4, 3, 2, 6, 6, 4, 7, 7, 4, 9, 1, 3, 0, 1, 0, 5, 6, 0, 1, 3, 2, 6, 7, 7, 6, 0, 9, 0, 2, 6, 3, 7, 0, 8, 7, 2, 0, 2, 6, 8, 2, 0, 7, 3, 5, 1, 0, 6, 6, 4, 4, 0, 0, 2, 6, 9, 8, 1, 2, 0, 1, 9, 7, 3, 6, 4, 4, 7, 8, 1, 3, 8, 4, 4, 5, 3, 5, 5, 8, 9, 6, 5, 3, 0, 6, 5, 2, 4, 4, 4, 4, 2, 3, 7, 0, 1, 7, 9, 7, 0, 3, 5, 1, 1, 6, 6, 9, 0, 7, 8, 8, 0, 9, 0, 7, 7, 9, 1, 0, 8, 0, 8, 7, 4, 7, 4, 3, 3, 0, 8, 4, 5, 2, 5, 1, 1, 4, 6, 6, 1, 7, 1, 5, 9, 4, 0, 8, 8, 4, 0, 4, 7, 2, 6, 3, 5, 0, 3, 3, 4, 1, 6, 4, 8, 4, 5, 2, 1, 4, 5, 8, 5, 0, 5, 6, 6, 7, 8, 8, 6, 4, 0, 0, 8, 6, 6, 5, 9, 4, 4, 2, 3, 9, 5, 4, 6, 6, 6, 7, 4, 8, 2, 7, 2, 1, 8, 3, 2, 3, 4, 8, 2, 3, 5, 1, 1, 0, 5, 4, 6, 8, 2, 3, 4, 3, 0, 4, 4, 5, 1, 2, 0, 2, 4, 1, 3, 6, 1, 1, 8, 1, 0, 0, 2, 8, 2, 7, 8, 0, 6, 9, 4, 0, 7, 1, 6, 3, 0, 7, 4, 3, 7, 0, 4, 1, 9, 1, 0, 8, 5, 0, 7, 7, 0, 3, 9, 0, 0, 9, 9, 7, 1, 0, 4, 6, 5, 6, 2, 0, 3, 3, 0, 1, 1, 1, 3, 2, 4, 7, 3, 6, 6, 4, 2, 8, 9, 2, 3, 4, 8, 7, 6, 6, 7, 7, 1, 7, 7, 6, 9, 7, 5, 1, 6, 9, 1, 2, 1, 0, 7, 2, 6, 2, 7, 3, 9, 0, 1, 2, 1, 2, 2, 2, 9, 1, 9, 0, 0, 9, 7, 7, 3, 2, 9, 3, 8, 1, 3, 6, 8, 8, 8, 4, 6, 1, 5, 9, 2, 9, 4, 0, 7, 7, 0, 7, 4, 5, 0, 5, 9, 8, 6, 5, 2, 9, 0, 2, 4, 5, 0, 1, 7, 0, 3, 8, 1, 2, 5, 2, 4, 8, 9, 6, 3, 1, 2, 8, 2, 4, 4, 0, 4, 8, 7, 4, 1, 4, 0, 3, 7, 7, 4, 2, 0, 9, 1, 9, 0, 7, 5, 6, 5, 9, 5, 9, 1, 3, 5, 7, 9, 7, 6, 0, 2, 4, 6, 8, 5, 4, 4, 0, 1, 7, 3, 3, 7, 7, 0, 8, 2, 7, 6, 2, 8, 9, 2, 0, 4, 2, 8, 3, 9, 4, 4, 6, 3, 0, 0, 7, 7, 3, 2, 2, 3, 6, 1, 6, 1, 1, 8, 2, 1, 9, 9, 0, 2, 1, 3, 7, 8, 5, 6, 6, 2, 5, 9, 0, 1, 9, 6, 6, 8, 8, 9, 1, 7, 1, 6, 3, 9, 7, 8, 6, 0, 9, 3, 7, 8, 1, 9, 5, 0, 4, 0, 1, 1, 9, 4, 3, 1, 7, 2, 6, 5, 2, 6, 4, 3, 8, 7, 3, 2, 5, 5, 6, 0, 5, 6, 7, 5, 2, 5, 7, 9, 7, 1, 5, 6, 3, 7, 8, 9, 4, 1, 0, 9, 8, 5, 7, 7, 9, 1, 4, 6, 0, 2, 1, 7, 7, 0, 2, 9, 1, 4, 1, 4, 0, 3, 7, 0, 7, 2, 6, 6, 6, 2, 6, 6, 8, 4, 3, 0, 3, 4, 6, 2, 0, 3, 8, 0, 2, 6, 7, 5, 5, 2, 1, 7, 6, 9, 4, 0, 2, 5, 9, 8, 3, 3, 2, 5, 0, 4, 6, 3, 3, 7, 2, 3, 9, 0, 9, 2, 7, 9, 3, 6, 6, 7, 5, 2, 1, 8, 1, 6, 0, 8, 8, 7, 6, 2, 9, 3, 2, 0, 4, 6, 6, 1, 8, 5, 6, 6, 7, 6, 5, 9, 2, 6, 8, 9, 1, 7, 6, 7, 2, 6, 3, 6, 7, 2, 3, 6, 8, 8, 4, 0, 6, 1, 7, 5, 9, 5, 3, 3, 1, 2, 5, 5, 0, 0, 7, 8, 5, 0, 3, 3, 0, 3, 3, 4, 9, 7, 5, 5, 6, 4, 6, 1, 9, 1, 0, 2, 9, 3, 7, 6, 5, 4, 7, 4, 5, 5, 7, 8, 7, 9, 6, 0, 8, 2, 3, 4, 8, 9, 2, 4, 1, 8, 1, 6, 2, 7, 7, 9, 7, 6, 4, 2, 9, 0, 6, 1, 2, 6, 7, 7, 7, 8, 4, 6, 7, 6, 3, 6, 7, 4, 4, 1, 1, 5, 4, 8, 1, 0, 6, 4, 4, 7, 6, 0, 6, 7, 1, 8, 2, 2, 0, 8, 4, 4, 3, 5, 8, 8, 7, 7, 2, 5, 6, 8, 5, 7, 3, 7, 2, 6, 4, 1, 8, 8, 9, 6, 3, 3, 9, 0, 3, 4, 0, 3, 7, 4, 3, 7, 9, 4, 8, 4, 8, 7, 2, 7, 4, 7, 4, 1, 6, 1, 1, 6, 4, 8, 2, 3, 5, 1, 6, 9, 2, 8, 6, 1, 0, 7, 7, 0, 5, 6, 1, 0, 8, 0, 8, 7, 7, 0, 3, 9, 7, 2, 5, 4, 0, 6, 9, 6, 4, 8, 3, 4, 3, 8, 9, 3, 5, 6, 5, 9, 1, 1, 3, 3, 5, 6, 7, 4, 4, 0, 2, 7, 5, 4, 0, 8, 5, 5, 3, 3, 6, 3, 5, 2, 6, 7, 0, 4, 3, 8, 3, 7, 1, 0, 1, 9, 5, 2, 3, 3, 1, 3, 2, 0, 5, 3, 7, 7, 0, 8, 9, 6, 6, 4, 3, 2, 1, 7, 2, 5, 8, 3, 2, 2, 6, 5, 3, 5, 7, 5, 1, 6, 1, 7, 8, 8, 4, 0, 2, 6, 7, 7, 6, 5, 7, 0, 5, 9, 8, 0, 8, 1, 2, 6, 8, 9, 9, 7, 0, 9, 5, 7, 1, 5, 7, 8, 0, 7, 9, 3, 7, 3, 9, 1, 9, 6, 9, 1, 2, 7, 8, 3, 9, 4, 9, 3, 1, 9, 0, 7, 5, 4, 5, 8, 6, 6, 7, 2, 8, 0, 6, 9, 5, 5, 8, 7, 8, 1, 8, 3, 9, 7, 3, 4, 7, 9, 8, 8, 1, 6, 6, 2, 7, 3, 3, 6, 0, 1, 1, 2, 3, 4, 3, 0, 8, 3, 7, 2, 5, 9, 0, 5, 7, 7, 5, 9, 3, 7, 3, 9, 9, 8, 9, 0, 7, 0, 9, 7, 6, 5, 3, 9, 0, 6, 8, 2, 5, 7, 0, 1, 4, 4, 7, 8, 5, 9, 9, 0, 7, 9, 2, 6, 3, 2, 1, 8, 1, 2, 6, 6, 3, 3, 0, 1, 3, 0, 2, 2, 8, 6, 1, 6, 4, 3, 8, 2, 4, 6, 0, 4, 3, 7, 1, 9, 6, 6, 7, 4, 4, 9, 9, 5, 7, 0, 1, 2, 1, 3, 0, 5, 9, 8, 8, 4, 0, 0, 9, 4, 7, 7, 6, 4, 7, 2, 3, 5, 8, 9, 5, 9, 6, 0, 8, 3, 8, 0, 1, 7, 9, 4, 5, 2, 0, 2, 9, 0, 7, 9, 7, 5, 3, 2, 2, 5, 8, 8, 0, 3, 3, 1, 6, 4, 0, 8, 3, 6, 5, 8, 3, 3, 6, 8, 6, 4, 7, 7, 2, 1, 6, 1, 2, 0, 0, 0, 4, 6, 1, 3, 0, 0, 2, 9, 3, 8, 1, 1, 4, 7, 6, 6, 5, 7, 5, 9, 3, 7, 4, 8, 0, 3, 8, 3, 5, 9, 2, 1, 3, 2, 2, 5, 7, 5, 0, 6, 4, 8, 2, 7, 4, 1, 9, 0, 8, 7, 9, 7, 6, 4, 2, 1, 7, 9, 7, 4, 5, 6, 1, 1, 7, 7, 1, 9, 9, 0, 3, 6, 2, 4, 8, 2, 9, 9, 1, 6, 3, 6, 5, 9, 3, 8, 9, 2, 9, 9, 3, 7, 6, 7, 6, 1, 3, 0, 0, 5, 7, 8, 1, 9, 3, 1, 6, 6, 3, 4, 4, 5, 8, 0, 7, 4, 1, 6, 0, 5, 5, 2, 5, 4, 2, 9, 3, 8, 9, 8, 4, 2, 7, 2, 0, 8, 4, 1, 1, 6, 4, 0, 1, 6, 0, 4, 7, 5, 1, 0, 3, 9, 6, 9, 9, 7, 0, 6, 2, 7, 0, 6, 9, 3, 9, 8, 8, 5, 0, 7, 1, 0, 2, 0, 0, 8, 6, 3, 3, 2, 3, 1, 2, 5, 6, 2, 8, 2, 6, 0, 2, 5, 9, 9, 0, 5, 0, 2, 9, 4, 6, 3, 7, 6, 2, 2, 0, 0, 9, 8, 7, 3, 7, 7, 5, 4, 4, 2, 9, 1, 9, 4, 5, 3, 1, 4, 1, 8, 6, 0, 5, 2, 6, 8, 1, 9, 6, 8, 0, 8, 7, 9, 3, 1, 9, 5, 6, 0, 2, 1, 4, 7, 7, 3, 4, 1, 6, 8, 0, 4, 1, 8, 9, 2, 0, 3, 6, 2, 4, 4, 3, 2, 2, 6, 7, 3, 6, 5, 7, 3, 5, 8, 4, 8, 0, 0, 3, 0, 5, 3, 3, 8, 3, 2, 1, 3, 1, 1, 3, 3, 8, 0, 1, 1, 7, 4, 6, 1, 2, 3, 0, 5, 5, 0, 3, 9, 3, 5, 8, 6, 8, 1, 8, 7, 0, 4, 1, 8, 9, 7, 7, 0, 5, 3, 1, 4, 8, 5, 3, 5, 1, 0, 3, 0, 8, 2, 1, 1, 9, 1, 6, 4, 0, 4, 4, 0, 3, 8, 1, 6, 3, 5, 9, 9, 8, 4, 2, 7, 1, 0, 3, 1, 1, 1, 0, 6, 8, 1, 5, 8, 1, 0, 5, 0, 1, 4, 1, 9, 5, 0, 9, 6, 9, 5, 6, 0, 3, 1, 4, 3, 0, 4, 4, 3, 9, 0, 2, 9, 3, 3, 1, 1, 2, 1, 7, 5, 8, 3, 7, 1, 1, 1, 5, 8, 0, 9, 9, 4, 1, 7, 3, 3, 8, 8, 0, 7, 8, 7, 0, 4, 1, 2, 2, 3, 0, 9, 3, 6, 5, 0, 0, 4, 2, 2, 9, 1, 4, 5, 7, 0, 2, 0, 1, 7, 9, 8, 3, 7, 6, 0, 5, 4, 1, 0, 6, 3, 4, 0, 9, 1, 2, 7, 4, 0, 6, 5, 2, 0, 3, 7, 5, 1, 7, 6, 7, 2, 1, 0, 0, 1, 4, 8, 2, 2, 4, 6, 4, 1, 3, 8, 3, 8, 9, 6, 4, 1, 4, 8, 1, 5, 6, 0, 4, 5, 9, 1, 0, 2, 6, 4, 1, 0, 1, 7, 3, 2, 7, 7, 7, 1, 5, 2, 9, 5, 9, 9, 0, 4, 9, 5, 1, 4, 3, 1, 6, 4, 9, 4, 3, 3, 3, 8, 0, 7, 1, 0, 8, 0, 6, 3, 0, 1, 5, 4, 3, 2, 9, 6, 7, 1, 5, 8, 1, 2, 5, 1, 1, 0, 0, 9, 6, 0, 3, 3, 1, 0, 3, 2, 3, 1, 5, 3, 2, 2, 3, 4, 9, 2, 5, 8, 0, 2, 4, 2, 6, 5, 1, 9, 7, 5, 0, 1, 4, 2, 3, 0, 2, 6, 7, 1, 6, 4, 4, 8, 6, 2, 4, 2, 7, 7, 5, 4, 5, 7, 4, 3, 5, 7, 7, 3, 3, 1, 8, 6, 1, 5, 2, 8, 1, 3, 6, 7, 4, 2, 3, 0, 7, 9, 0, 8, 7, 1, 4, 3, 3, 4, 0, 9, 8, 7, 9, 9, 3, 8, 1, 6, 6, 1, 4, 9, 2, 9, 3, 3, 1, 7, 6, 0, 7, 3, 2, 6, 2, 4, 1, 7, 9, 2, 2, 0, 3, 2, 2, 9, 4, 1, 2, 6, 8, 6, 0, 9, 6, 0, 6, 7, 0, 2, 4, 3, 6, 3, 6, 3, 9, 2, 4, 3, 4, 8, 5, 0, 2, 3, 2, 0, 3, 5, 7, 4, 5, 4, 7, 9, 9, 2, 9, 9, 7, 3, 7, 7, 0, 6, 1, 1, 7, 0, 8, 9, 1, 5, 3, 6, 7, 8, 6, 6, 4, 7, 5, 2, 3, 6, 1, 1, 0, 8, 1, 3, 7, 4, 3, 8, 1, 8, 2, 6, 1, 5, 9, 4, 6, 2, 4, 4, 5, 0, 9, 4, 8, 2, 6, 1, 5, 0, 8, 4, 7, 7, 7, 1, 0, 7, 3, 7, 0, 0, 3, 2, 4, 9, 1, 0, 3, 8, 8, 9, 3, 3, 7, 7, 2, 2, 1, 9, 0, 7, 4, 2, 4, 5, 0, 0, 1, 3, 4, 3, 5, 1, 0, 7, 0, 0, 0, 0, 9, 6, 8, 6, 6, 9, 4, 3, 3, 7, 0, 7, 2, 2, 6, 1, 4, 2, 0, 3, 0, 7, 7, 1, 1, 8, 3, 0, 3, 3, 1, 1, 6, 1, 4, 8, 1, 9, 9, 0, 4, 2, 5, 1, 4, 8, 7, 1, 1, 6, 3, 2, 8, 5, 3, 6, 8, 1, 1, 8, 0, 7, 9, 1, 9, 5, 6, 3, 4, 0, 3, 9, 1, 1, 4, 9, 4, 1, 8, 9, 4, 1, 5, 0, 2, 5, 1, 6, 6, 6, 0, 2, 3, 2, 4, 3, 9, 9, 6, 3, 7, 1, 2, 6, 3, 7, 0, 5, 8, 7, 8, 7, 6, 7, 1, 1, 6, 4, 4, 4, 7, 1, 1, 5, 1, 9, 3, 7, 6, 0, 9, 8, 7, 6, 5, 1, 7, 3, 0, 5, 5, 5, 9, 8, 7, 4, 9, 6, 7, 5, 9, 2, 3, 0, 3, 2, 9, 9, 7, 7, 5, 8, 2, 5, 6, 8, 2, 6, 0, 4, 8, 9, 5, 4, 1, 1, 2, 4, 8, 8, 7, 6, 9, 8, 6, 8, 5, 1, 8, 7, 2, 2, 2, 3, 6, 4, 3, 2, 2, 5, 7, 6, 2, 0, 0, 1, 3, 9, 9, 2, 3, 9, 9, 2, 8, 0, 1, 1, 9, 8, 2, 9, 8, 0, 2, 7, 6, 9, 8, 2, 2, 3, 6, 9, 4, 9, 3, 2, 9, 8, 2, 4, 7, 5, 3, 3, 3, 4, 2, 8, 7, 6, 9, 9, 3, 9, 3, 9, 6, 4, 4, 5, 4, 4, 9, 9, 2, 4, 7, 7, 2, 9, 3, 1, 6, 4, 8, 5, 7, 5, 9, 8, 9, 4, 2, 8, 1, 3, 7, 3, 5, 8, 8, 6, 1, 0, 8, 9, 1, 6, 3, 6, 5, 5, 3, 8, 1, 3, 0, 8, 4, 5, 8, 8, 0, 3, 2, 2, 4, 0, 0, 9, 8, 5, 9, 8, 1, 1, 3, 0, 0, 3, 5, 5, 3, 4, 3, 1, 4, 9, 7, 5, 6, 6, 3, 8, 9, 3, 8, 5, 2, 8, 8, 7, 7, 3, 2, 5, 9, 9, 5, 3, 8, 7, 2, 0, 3, 4, 1, 8, 7, 3, 4, 7, 1, 7, 1, 5, 2, 1, 2, 3, 3, 6, 7, 4, 9, 3, 4, 9, 0, 9, 7, 3, 3, 0, 3, 8, 6, 9, 5, 5, 6, 0, 3, 6, 5, 0, 3, 3, 1, 6, 6, 7, 5, 0, 6, 6, 0, 1, 7, 2, 8, 9, 9, 8, 3, 9, 9, 0, 2, 1, 2, 4, 3, 7, 4, 2, 2, 0, 6, 5, 2, 7, 5, 3, 0, 6, 2, 1, 5, 4, 4, 8, 7, 3, 4, 1, 3, 9, 1, 5, 0, 7, 2, 6, 2, 7, 6, 4, 0, 9, 8, 0, 8, 4, 0, 3, 6, 1, 7, 8, 9, 2, 4, 9, 3, 0, 9, 9, 9, 6, 8, 0, 1, 2, 9, 1, 2, 0, 1, 2, 2, 6, 0, 4, 8, 7, 4, 6, 8, 9, 5, 9, 1, 7, 4, 7, 6, 8, 4, 0, 8, 4, 9, 8, 1, 1, 8, 7, 1, 1, 8, 4, 1, 9, 0, 4, 5, 5, 2, 0, 9, 9, 2, 9, 3, 1, 1, 8, 5, 9, 5, 1, 4, 7, 8, 8, 6, 1, 0, 7, 3, 7, 7, 5, 9, 0, 0, 6, 2, 0, 3, 8, 3, 3, 8, 7, 0, 0, 5, 5, 5, 4, 2, 0, 3, 5, 8, 0, 7, 2, 8, 6, 2, 9, 7, 6, 7, 9, 1, 0, 7, 5, 1, 0, 4, 6, 1, 3, 0, 3, 6, 3, 9, 4, 9, 9, 9, 6, 5, 7, 2, 3, 5, 2, 8, 8, 4, 7, 8, 8, 8, 1, 3, 9, 3, 6, 3, 7, 2, 0, 7, 4, 1, 0, 7, 5, 0, 5, 4, 5, 3, 5, 5, 1, 7, 0, 5, 1, 4, 8, 8, 7, 7, 3, 0, 9, 8, 1, 2, 3, 0, 8, 9, 7, 2, 3, 9, 4, 6, 6, 7, 2, 9, 6, 2, 2, 9, 1, 0, 9, 6, 3, 0, 3, 3, 9, 0, 4, 4, 8, 0, 0, 1, 4, 3, 3, 8, 4, 6, 7, 8, 6, 8, 1, 7, 0, 9, 0, 2, 2, 4, 0, 8, 4, 3, 0, 0, 2, 5, 7, 1, 3, 3, 2, 4, 1, 7, 4, 1, 1, 5, 6, 5, 1, 9, 2, 0, 6, 9, 6, 1, 2, 5, 5, 1, 1, 5, 1, 4, 0, 2, 4, 8, 2, 3, 1, 1, 6, 7, 1, 9, 3, 3, 6, 3, 8, 3, 2, 9, 0, 8, 3, 1, 9, 1, 7, 9, 2]
print('Classification Report')
print(classification_report(y_svhn_test,y_svhn_pred_final))
Classification Report
precision recall f1-score support
0 0.77 0.81 0.79 1814
1 0.77 0.80 0.79 1828
2 0.74 0.78 0.76 1803
3 0.71 0.72 0.71 1719
4 0.81 0.80 0.81 1812
5 0.76 0.70 0.73 1768
6 0.76 0.76 0.76 1832
7 0.81 0.82 0.82 1808
8 0.74 0.72 0.73 1812
9 0.77 0.73 0.75 1804
accuracy 0.76 18000
macro avg 0.76 0.76 0.76 18000
weighted avg 0.76 0.76 0.76 18000
cm=confusion_matrix(y_svhn_test.tolist(),y_svhn_pred_final)
plt.figure(figsize=(10,7))
sns.heatmap(cm,annot=True,fmt='d', cmap='Blues')
plt.xlabel('Predicted')
plt.ylabel('Truth')
plt.show()